1. 程式人生 > >php 中的錯誤處理機制

php 中的錯誤處理機制

all 總結 err shutdown fat func style 運行 test

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 中的錯誤處理機制