PHP错误处理 - set_error_handler()的用法
定义和用法
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