摘要:這樣的話,就沒有合其他致命錯誤區分了,那么,有沒有專門處理未捕獲的異常呢答案是有的,它就是測試代碼如下讓錯誤信息在標準輸出可見回調函數簽名結果如下結論可以對未捕獲的異常進行處理,但是腳本仍然會因為致命錯誤而中斷。
錯誤
常見的錯誤類型 運行時錯誤這里說的錯誤,可能是由 語法解析、運行時等各種原因產生的信息引起的
E_ERROR - 致命錯誤
定義:致命的運行時錯誤
后果:腳本終止不再繼續運行
E_WARNING - 警告
定義:運行時警告 (非致命錯誤)
后果:給出提示信息,但是腳本不會終止運行
E_NOTICE - 通知
定義:運行時通知
結果:給出通知信息,但是腳本不會終止運行
其他類型錯誤編譯時錯誤
eg. E_PARSE E_COMPILE_ERROR E_COMPILE_WARNING ...
用戶產生的信息
eg. E_USER_WARNING E_USER_ERROR E_USER_NOTICE
... 等
具體如下圖:
參考:PHP-錯誤處理-預定義常量
錯誤處理設置一般錯誤的處理函數這里只針對運行時錯誤進行處理,其他(如:語法錯誤 Zend 引擎產生的錯誤 等)不在討論范圍內。
核心方法:set_error_handler
測試代碼如下:
結果如下:
這里我們看到,set_error_handler 只對 E_WARNING E_NOTICE 進行了捕獲,并且當回調函數遇到
E_NOTICE 返回 true 的時候,我們看到底層對標準錯誤的輸出,但是遇到 E_WARNING 返回 false,我們并沒有看到底層對標準錯誤的輸出。總結,來自于官方手冊:
set_error_handler 第二個參數指定的錯誤類型都會繞過 PHP 標準錯誤處理程序
以下級別的錯誤不能由用戶定義的函數來處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING
備注:此方法可有針對性的對服務產生的消息進行收集,處理。比如:在框架初始化時,注冊一個定制化的錯誤回調。
那致命錯誤有沒有辦法處理呢?接著看。
設置致命錯誤處理函數我們知道致命錯誤會引起:腳本終止不再繼續運行。
那么,我們就可以利用 register_shutdown_function 方法做一些處理。
作用:注冊一個會在php中止時執行的函數測試代碼如下:
結果如下:
如前所述,發生致命錯誤,進程退出,但是中止之前執行了我們注冊的回調函數。
異常說明:我們這里指用戶自定義的異常。
try-catch 捕獲測試代碼如下:
getMessage() . PHP_EOL; } catch (Exception $e) { echo "Exception:" . $e->getMessage() . PHP_EOL; } finally { echo "here is finally" . PHP_EOL; }結果如下:
? answer git:(master) ? php exception.php UserException:This is exception here is finally這是常見的捕獲,不做過多說明,參見:異常處理
未捕獲的異常那么,如有拋出去的異常未被 catch,怎么辦?
我們先看一下,未被 catch 會怎么樣:結果如下:
? answer git:(master) ? php throw.php Fatal error: Uncaught exception "Exception" with message "I am an exception" in /Users/javin/github/answer/throw.php:5 Stack trace: #0 {main} thrown in /Users/javin/github/answer/throw.php on line 5會出現 致命錯誤,腳本中斷,那么,我們當然可以用上邊所說的 register_shutdown_function 來處理。
這樣的話,就沒有合其他致命錯誤區分了,那么,有沒有專門處理未捕獲的異常呢?
答案是有的,它就是:set_exception_handler測試代碼如下:
getMessage()); }); throw new Exception("I am an exception"); echo "I am here" . PHP_EOL;結果如下:
? answer git:(master) ? php throw.php This is exception, msg:I am an exception結論:set_exception_handler 可以對未捕獲的異常進行處理,但是腳本仍然會因為致命錯誤而中斷。
結尾本文對 異常處理 做了簡要的總結,其中涉及到三個核心方法 set_error_handler register_shutdown_function set_exception_handler,其詳細說明,請參見 官方手冊 。
同時 PHP-7 中也有一些新的特性,比如:Error 類參考:PHP 7 錯誤處理
最后,強烈建議開啟編輯器的 語法檢查 功能,不管是 IDE,還是 GUI 文本編輯器,還是 vim,這樣可以避免很多不必要的錯誤。如果有使用版本控制,可以給對應的軟件加上 語法檢查 的鉤子。
可以參考:
我的 vim-配置
自動化檢測PHP語法和編程規范(Git pre-commit)
以上如有錯誤,請多多指正。如有遺漏,請多多補充。?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26135.html
摘要:日期和時間使用類完成讀取設置比較和計算日期與時間。單元測試單元測試是從編寫開始,貫穿于整個開發周期的一種用于保證函數類和方法的行為與預期一致的編程方法。是應用的單元測試框架的業界標準,其他幾個可選框架是行為驅動開發行為驅動開發有兩種方式和。 《php之道》閱讀地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...
摘要:一的幾個函數異常捕獲自定義處理函數注冊錯誤捕獲自定義處理函數注冊程序執行時異常終止錯誤捕獲處理函數注冊這三個函數在錯誤處理控制中給開發者提供了很大的自主空間,在日志系統中記錄日志信息有他們的功勞。下面要說的類庫是借鑒了日志系統的設計。 引言 接觸過php框架的朋友們可能都知道,日志在項目中的重要作用了,他可以幫助我們定位錯誤的位置,讓程序更友好(處理得當的話不會直接拋出一大堆只有程...
小編寫這篇文章的一個主要目的,就是來給大家去做一個解答,解答的內容主要是Python常見的一些bug和異常問題,那么,遇到這些問題的時候,我們需要找到好辦法去進行處理。那么,小編這邊就給大家做了一個總結,總結常見的異常問題,大家好好閱讀哦。 異常處理介紹 在實際的開發中,我們經常遇到一些報錯的例子,在pycharm的顯示頁面下,當我們看到一串串的紅色的英文字母的時候,就是出現異常,這個時候...
閱讀 2883·2021-11-24 09:39
閱讀 2455·2019-08-30 15:53
閱讀 3025·2019-08-30 13:47
閱讀 1296·2019-08-30 12:50
閱讀 1481·2019-08-29 16:31
閱讀 2642·2019-08-29 13:14
閱讀 1559·2019-08-29 10:55
閱讀 790·2019-08-26 13:32