php 中的錯誤處理機制
php 裏有一套錯誤處理機制,可以使用 set_error_handler 接管 php 錯誤處理,也可以使用 trigger_error 函數主動拋出一個錯誤。
set_error_handler() 函數設置用戶自定義的錯誤處理函數。函數用戶創建運行期間用戶自己的錯誤處理方法。它需要先創建一個錯誤處理函數,然後設置錯誤級別。
語法:
set_error_handler(error_function, error_types)
參數:
error_function:規定發生錯誤時運行的函數。必需。
error_types:規定在哪個錯誤報告級別會顯示用戶自定義錯誤。可選。默認為 “E_ALL”。
使用該函數,會完全繞過標準 php 錯誤處理函數(除非在錯誤處理函數中返回 false)。
示例:
function customError($errno, $errstr, $errfile, $errline) { echo "錯誤代碼:[$errno] $errstr" . PHP_EOL; echo "錯誤所在代碼行:$errline 文件 $errfile" . PHP_EOL; // die; } set_error_handler("customError"); 5/0;
輸出:
錯誤代碼:[2] Division by zero 錯誤所在代碼行:15 文件 /xxx/test.php
在這裏有一個需要說明的是:php 中的錯誤和異常是不一樣的。php 中的錯誤默認是無法通過 try...catch 捕獲的,如果我們想要捕獲,可以在 error handler 裏面捕獲錯誤之後拋出一個異常。
我們也可以在某些地方使用 restore_error_handler 取消自定義的錯誤處理。
對於 fatal error:
如果我們也想對其進行一些處理,php 也提供了 register_shutdown_function,這個函數會在 php 程序終止或者 die 時觸發一個函數。
對於 parse error,我們可以修改 php.ini 添加配置:
log_errors=On
error_log=usr/log/php.log
總結:
在 php 中,錯誤和異常是兩個不同的概念,這種設計從根本上導致了 php 的異常和其他語言相異。Java 中,異常是錯誤唯一的報告方式。而 php 中異常絕大部分必須通過某種方法手動拋出,才能被捕獲到,是一種半自動化的異常處理機制。
無論是錯誤還是異常,都可以使用 handler 接管系統已有的處理機制。
php 中的錯誤處理機制