PHP的错误处理机制
php的錯誤處理是比較復雜的, 本文講解php中所有錯誤相關的重要知識點做一次梳理, 便于理解php的錯誤機制.
基礎知識
在此之前, 先熟悉一下php error的基礎知識
- 預定義常量
- 運行時配置
- 異常
- 錯誤處理函數
預定義常量
定義了所有php的錯誤類型常量, 每一個常量都是一個整型數值, 它的作用在于
上面的值(數值或者符號)用于建立一個二進制位掩碼,來制定要報告的錯誤信息。可以使用按位運算符來組合這些值或者屏蔽某些類型的錯誤。請注意,在 php.ini 之中,只有'|', '~', '!', '^' 和 '&' 會正確解析。
從使用的角度看, 可以分為三類:
E_USER_NOTICE,?E_USER_WARNING,?E_USER_ERROR,?E_USER_DEPRECATED
E_NOTICE,?E_PARSE,?E_WARNING,?E_ERROR,?E_COMPILE_ERROR,?E_COMPILE_WARNING,?E_STRICT,?E_RECOVERABLE_ERROR
E_CORE_ERROR,?E_CORE_WARNING
從是否終止程序執行的角度看, 可分為兩類
終止程序執行
程序終止, 進入處理錯誤流程
不終止程序執行
產生錯誤, 但程序仍可以繼續執行, 同樣進入錯誤處理流程
對于PHP中的錯誤類型, 可以參考這篇更詳細的文章--PHP的錯誤機制總結
運行時配置
手冊--運行時配置講解的很詳細, 但有幾個配置仍需特別注意
error_reporting
報告錯誤的類型, 建議在開發/測試環境配置成E_ALL, 解決所有的類型的錯誤后, 在生產環境配置E_ALL & E_DEPRECATED, 則表明:報告除廢棄錯誤外的所有錯誤
display_errors
是否顯示錯誤, 在生產環境中配置成false, 配合上面error_reporting的設置, 則表明: 報告除廢棄錯誤外的所有錯誤, 但不顯示錯誤信息.
log_errors
錯誤記錄是否開啟,?生產環境需開啟. 配合上面的兩項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤信息, 但記錄(只有php自己可以操作錯誤信息)到日志中.
error_log
指定錯誤的文件(syslog是特殊值).默認未被設置, 手冊中:
如果該配置沒有設置,則錯誤信息會被發送到 SAPI 錯誤記錄器
一般情況下, 未設置會被記錄到apache/nginx的錯誤日志中. 配合上面三項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤信息, 但記錄到apache/nginx日志中.若配置了文件路徑, 則表明:?報告除廢棄錯誤外的所有錯誤, 不顯示錯誤信息, 但記錄到file_dir日志中.
上面這幾項配置影響著php錯誤最基本的表現.當然,這些配置可以通過?ini_set()?在代碼中更改 或 php-fpm配置更改
錯誤處理函數
錯誤函數并不多, 最應該關注的就是set_error_handler?和?set_exception_handler, 因為通過它們可以介入錯誤/異常的處理流程.
上面提到過, 錯誤發生后, 都會進行錯誤處理流程, 那錯誤流程是如何定義的?
先看看php手冊中的講解:?Errors
簡單來說就是,?默認的處理流程就是通過配置完成, 但我們可以設置自定義的錯誤處理流程
終止腳本執行的錯誤如何處理
上文提到過, 錯誤有兩種, 那對于這種會終止腳本執行的錯誤如何處理?
set_error_handler不能處理這種錯誤, 這一點很容易被忽略. 所以要尋找另一種方法.
這個問題基本上是這樣完成的(還未見過其他方案):
// 終止腳本的錯誤會終止腳本執行 // 即會調用已通過register_shutdown_function注冊的處理函數 // 由此可注冊我們的錯誤處理流程, 這樣就進入了自定義錯誤流程 register_shutdown_function('FatalErrorHandle');...FatalErrorHandle(array $error = null) { ... if (null === $error) { // 通過這種方式可以獲取最后一條錯誤 $error = error_get_last(); } ... // log or other logic }異常
根據w3cPHP 異常處理中的講解:
異常處理用于在指定的錯誤(異常)情況發生時改變腳本的正常流程。這種情況稱為異常。
當異常被觸發時,通常會發生:
- 當前代碼狀態被保存
- 代碼執行被切換到預定義的異常處理器函數
- 根據情況,處理器也許會從保存的代碼狀態重新開始執行代碼,終止腳本執行,或從代碼中外的位置繼續執行腳本
未被catch的異常會終止腳本執行并產生一個E-ERROR錯誤, 執行定義的異常處理, 若無則進行php默認的錯誤處理流程, 即記錄到日志中. 但在編程概念上應該將異常與錯誤分開, 異常對于用戶而言是可預見的, 不符合預期的, 可控制的結構.
上文提到的set_exception_handler就是處理異常的, 用法與set_error_handler一致. 在各框架中的異常處理很成熟, 大致都是在set_exception_handler中將Exception轉移到框架可處理級別, 框架同時會開放良好的接口供用戶使用, 從而達到用戶控制異常處理的目的, 實現定制和擴展.
總結
php的錯誤處理機制總是被忽略, 但它對調試, 監控錯誤有很大的作用. 本文主要介紹了其中的主要知識點, 并做了一個梳理, 希望對大家有用.更多的細節還請查看手冊.
學習資料
預定義常量
運行時配置
錯誤處理函數
PHP的錯誤機制總結
異常
Errors
PHP 異常處理
Symfony Debug:是一個完整的應用, 可以說是一個全面的指導教程, 所有與error相關的知識點都涉及到了. 建議閱讀源代碼.
轉載于:https://www.cnblogs.com/zcbing/p/6637926.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的PHP的错误处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ object model
- 下一篇: 用samba来创建windows下的文件