PHP 中提供一个 set_error_handler() 函数,使用该函数可以指定另一个函数作为错误处理函数,其语法如下:
1) $error_handler 是用户自定义的函数名称,除了可以传入函数名,还可以传入 NULL 重置处理程序到默认状态,还可以传入引用对象和对象方法名的数组。
用户自定义函数的格式如下:
其中:
注意:如果 set_error_handler() 函数返回 FALSE,标准错误处理程序将会继续调用。
2) $error_types 参数就像配置文件 php.ini 中 error_reporting 能够控制错误的显示一样,此参数能够用于屏蔽 $error_handler 的触发。如果没有该掩码,无论 $error_reporting 是如何设置的,$error_handler 都会在每个错误发生时被调用。
如果之前有定义过错误处理程序,则返回该程序名称;如果是内置的错误处理程序,则返回 NULL。如果指定了一个无效的回调函数,同样会返回 NULL。如果之前的错误处理程序是一个类的方法,此函数会返回一个带类和方法名的索引数组(indexed array)。
【示例】自定义一个错误处理函数,并使用它来处理程序中的错误。
<?php
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();
?>
运行结果如下:
注意:使用这种方式进行错误处理,如果没有在错误处理函数中终止程序的执行,程序将会继续执行发生错误的下一行,所以需要使用 die() 函数来终止程序的运行。
另外需要注意的是,这种错误处理方式并不能接管所有级别的程序错误,E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING 以及 E_STRICT 部分的错误将会以最原始的形式显示出来。
PHP 的异常处理机制不完善,无法自动抛出异常,用户也可使用 set_error_handler() 这种方式将异常当作错误来处理,这样用户就可以使用自定义的错误处理函数来自动捕获异常了。
【示例】使用自定义的错误处理函数来自动捕获异常。
<?php
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");
/* 触发异常 */
try {
$a = 5/0;
echo $a;
} catch(Exception $e) {
echo $e->getMessage();
}
?>
运行结果如下:
当程序执行到第 12 行 $a = 5/0; 语句时,程序会自动捕获了这个异常,并由用户自定义的函数进行处理。