定義和用法
set_error_handler 設定用戶自定義的錯誤處理函數. 方便用戶自己定義來處理運行中的錯誤.
語法
set_error_handler ( callable $errror_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
參數
參數 | 描述 |
error_handler | 必須。規定發生錯誤時運行的函數 |
error_types | 可選。規定在哪個錯誤報告級別會顯示用戶定義的錯誤。默認是 "E_ALL"。 |
error_handler
以下格式的回調(callback): 可以傳入 null 重置處理程序到默認狀態。 除了可以傳入函數名,還可以傳入引用對象和對象方法名的數組。
handler ( int $errsn , string $errstr [, string $errfile [, int $errline [, array$errcontext]]] ) : bool
參數 | 描述 |
errno | 必須。錯誤級別,是一個integer |
errstr | 必須。錯誤信息,是一個string |
errfile | 可選。錯誤的文件名,是一個string |
errline | 可選。錯誤的行號, 是一個integer |
errcontext 在php7.2.0以后被棄用。
重點1: error_types里指定的錯誤類型都會繞過php標准錯誤處理程序, 除非回調函數返回了FALSE.
例子1: error_type 默認的是E_ALL, 因為沒有定義$a, 所以報Notic錯誤, 繞過了PHP標准錯誤處理程序,調用回調函數。
<?php function myErrorHandler($errno, $errstr, $errfile, $errline) { switch ($errno) { case E_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; case E_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; } $error_handler = set_error_handler("myErrorHandler"); if($a == 1) { echo 'test error'; }
輸出:
My NOTICE</b> [8] Undefined variable: a
例子2: 利用error_reporting()函數 和 $errno 進行位與運算返回FALSE 或者在匹配的E_NOTICE中 return FALSE 就會走PHP標准錯誤處理程序.
<?php function myErrorHandler($errno, $errstr, $errfile, $errline) { if ((error_reporting() & $errno)) { return false; } switch ($errno) { case E_NOTICE: //return FALSE; echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; } $error_handler = set_error_handler("myErrorHandler"); if($a == 1) { echo 'test error'; }
輸出:
PHP Notice: Undefined variable: a in /root/testerror1.php on line 22
重點2: error_reporting()設置將不會起到作用而你的錯誤處理函數繼續會被調用, 不過仍然可以獲取error_reporting的當前值,並做處理.
例子: 設置error_reporting 為E_ERROR | E_WARNING | E_PARSE 去除E_NOTICE ,但是錯誤處理函數繼續被調用
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE); function myErrorHandler($errno, $errstr, $errfile, $errline) { //if (!(error_reporting() & $errno)) { // return false; //} switch ($errno) { case E_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; } $error_handler = set_error_handler("myErrorHandler"); if($a == 1) { echo 'test error'; }
輸出:
<b>My NOTICE</b> [8] Undefined variable: a<br />
重點3: 錯誤處理函數報錯后,程序依然進行,有需要的時候使用die()
<?php function myErrorHandler($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { return false; } switch ($errno) { case E_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; //die() default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; } $error_handler = set_error_handler("myErrorHandler"); if($a == 1) { echo 'test error'; } echo "hello";
輸出:
<b>My NOTICE</b> [8] Undefined variable: a<br />
hello
重點4: 如果錯誤發生在執行腳本之前, 將不會調用自定義的錯誤處理程序, 因為它尚未被注冊.
<?php function myErrorHandler($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { return false; } switch ($errno) { case E_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; } if($a == 1) { echo 'test error'; } $error_handler = set_error_handler("myErrorHandler"); echo "hello";
輸出:
PHP Notice: Undefined variable: a in /root/testerror1.php on line 19
hello
重點5:error_handler 除了可以傳函數名,還可以傳數組或者對象
<?php class errorHandler{ public function myErrorHandler($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { return false; } switch($errno) { case E_NOTICE: echo "<b> My NOTICE</b> [$errno] $errstr <br />"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; } } $error_handler = set_error_handler(array('errorHandler', 'myErrorHandler')); if ( $a == 1) { echo "test error"; }
輸出:
My NOTICE [8] Undefined variable: a