php的錯誤處理是比較複雜的, 本文講解php中所有錯誤相關的重要知識點做一次梳理, 便於理解php的錯誤機制.
在此之前, 先熟悉一下php error的基礎知識
#預先定義常數
#上面的值(數值或符號)用於建立一個二進位位元掩碼,來制定要報告的錯誤訊息。可以使用位元運算子來組合這些值或屏蔽某些類型的錯誤。請注意,在 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
程式終止, 進入處理錯誤流程
產生錯誤, 但程式仍可以繼續執行, 同樣進入錯誤處理流程
#error_reporting報告錯誤的類型, 建議在開發/測試環境配置成
E_ALL, 解決所有的類型的錯誤後, 在生產環境配置
E_ALL & E_DEPRECATED, 則表示:報告除廢棄錯誤以外的所有錯誤
display_errors是否顯示錯誤, 在生產環境中配置成false , 配合上面
error_reporting的設定, 則表示: 報告除廢棄錯誤外的所有錯誤, 但不顯示錯誤訊息.
錯誤記錄是否開啟,
生產環境需開啟
. 配合上面的兩項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤訊息, 但記錄(只有php自己可以操作錯誤訊息)到日誌中.
#指定錯誤的檔案
(syslog是特殊值)
.預設未被設定, 手冊中:
如果該配置沒有設置,則錯誤訊息會被傳送到SAPI 錯誤記錄器報告除廢棄錯誤外的所有錯誤, 不顯示錯誤訊息, 但記錄到一般情況下, 未設定會被記錄到apache/nginx的錯誤日誌中. 配合上面三項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤訊息, 但記錄到apache/nginx日誌中.若配置了檔案路徑, 則表明:
file_dir日誌中.
上面這幾項配置影響著php錯誤最基本的表現。當然,這些配置可以透過
在程式碼中更改或php-fpm配置更改錯誤處理函數
和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 }
異常
當異常被觸發時,通常會發生:
當前程式碼狀態被保存
- 程式碼執行被切換到預先定義的異常處理器函數
根據情況,處理器也許會從已儲存的程式碼狀態重新開始執行程式碼,終止腳本執行,或從程式碼中外的位置繼續執行腳本
未被catch的異常會終止腳本執行並產生一個E-ERROR錯誤, 執行定義的異常處理, 若無則進行php預設的錯誤處理流程, 即記錄到日誌中. 但在程式設計概念上應該將異常與錯誤分開, 異常對於用戶而言是可預見的, 不符合預期的, 可控制的結構.
上文提到的set_exception_handler
就是處理異常的, 用法與set_error_handler
一致. 在各框架中的異常處理很成熟, 大致都是在set_exception_handler
中將Exception
轉移到框架可處理級別, 框架同時會開放良好的介面供用戶使用, 從而達到用戶控制異常處理的目的, 實現定制和擴展.
php的錯誤處理機制總是被忽略, 但它對調試,監控錯誤有很大的作用. 本文主要介紹了其中的主要知識點, 並做了一個梳理, 希望對大家有用.更多的細節還請查看手冊.
#預先定義常數
執行階段配置
錯誤處理函數
PHP的錯誤機制總結
異常
Errors
PHP 異常處理
Symfony Debug:是一個完整的應用, 可以說是一個全面的指導教程, 所有與error相關的知識點都涉及到了. 建議閱讀源代碼.
以上是PHP的錯誤處理的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!