首页 > 编程笔记 > PHP笔记 阅读:15

PHP set_error_handler():自定义错误处理函数

PHP 中提供一个 set_error_handler() 方法,支持用户自定义一个错误处理函数,语法如下:

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

本函数可以用自定义的方式来处理运行中的错误,例如,在应用程序中严重发生错误时,或者在特定条件下触发了一个错误(使用 trigger_error()),需要对程序进行处理时。

参数说明

1) error_handler 是用户自定义的函数名称,此函数需要接收两个参数:错误码和描述错误的 string。另外有可能提供 3 个可选参数,发生错误的文件名、发生错误的行号以及发生错误的上下文(一个指向错误发生时活动符号表的array)。

用户自定义的函数如下:

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )

参数说明如下:
也就是说,errcontext 会包含错误触发处作用域内所有变量的数组。用户的错误处理程序不应该修改错误上下文(context)。如果函数返回 false,标准错误处理程序将会继续调用。

2) error_types 参数就像 error_reporting 的 ini 设置能够控制错误的显示一样,规定在哪个错误报告级别产生时会显示错误,默认为“E_ALL”。

set_error_handler() 示例

下面一个例子演示 set_error_handler() 函数的使用。
function error_handler($errno, $errstr, $errfile, $errline ) {
    echo "error number:".$errno."<br/>";
    echo "error msg:".$errstr."<br/>";
    echo "error file:".$errfile."<br/>";
    echo "error line:".$errline."<br/>";
    die('something error');
}
set_error_handler("error_handler");
strpos();
首先定义一个错误处理函数 error_handler(),用 set_error_handler() 指定其接管系统的标准错误处理程序。

执行以上代码会在浏览器打印出如下结果:

error number:2
error msg:strpos() expects at least 2 parameters, 0 given
error file:/Library/WebServer/Documents/book/try.php
error line:96
something error

使用这种方式进行错误处理,如果没有在错误处理函数中终止程序的执行,程序将会继续执行发生错误的下一行,所以如有必要可使用 die()。

另外需要注意的是,这种错误处理方式并不能接管所有级别的程序错误,E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING 以及 E_STRICT 部分的错误将会以最原始的形式显示出来。

set_error_handler() 进阶

PHP 的异常处理机制不完善,无法自动抛出异常,用户也可使用 set_error_handler() 这种方式将异常当作错误来处理,这样用户就可以使用自定义的错误处理函数来自动捕获异常了。

代码演示如下:
function error_handler($errno, $errstr, $errfile, $errline ) {
    echo "error number:".$errno."<br/>";
    echo "error msg:".$errstr."<br/>";
    echo "error file:".$errfile."<br/>";
    echo "error line:".$errline."<br/>";
    die('something error');
    // throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("error_handler");
/* Trigger exception */
try {
    $a = 5/0;
    var_dump($a);
} catch(Exception $e) {
    echo $e->getMessage();
}
以上程序的执行结果为:

error number:2
error msg:Division by zero
error file:/Library/WebServer/Documents/book/try.php
error line:98
something error

当程序执行到 $a=5/0 语句时,程序自动捕获了这个异常,并由用户自定义的函数进行处理。

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章