每当调用未定义的函数时,都不会记录错误。而是脚本停止执行。更糟糕的是,如果我运行php -l filename.php,它会显示没有语法错误。我正在使用自定义错误处理程序函数,但即使是第一行也永远不会到达。
如果调用未定义的函数,如何让它运行我的错误处理程序?
我使用的是PHP 5.3.2-1。以下是设置错误处理程序的代码:
error_reporting(-1);
$old_error_handler = set_error_handler( "userErrorHandler" );
set_exception_handler('exception_handler');
错误处理程序和异常处理程序都没有到达,尽管它们可以解决其他错误。
我想要这个的原因是我最终不得不在我的代码中放置调试语句以查看它在停止执行之前得到多远这是一个缓慢的过程,而错误消息会告诉我文件和行号在哪里错误是。
答案 0 :(得分:8)
用户错误处理程序无法捕获致命错误。
请参阅http://php.net/manual/en/function.set-error-handler.php
特别是部分:
使用用户定义无法处理以下错误类型 功能:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING, E_COMPILE_ERROR,E_COMPILE_WARNING和大多数E_STRICT在 调用set_error_handler()的文件。
根据PHP手册页上的评论,一个解决方法是测试关机功能中的错误:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 0);
function shutdown(){
$isError = false;
if ($error = error_get_last()){
switch($error['type']){
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
$isError = true;
break;
}
}
if ($isError){
echo "Script execution halted ({$error['message']})";
} else {
echo "Script completed";
}
}
register_shutdown_function('shutdown');
?>
答案 1 :(得分:0)
set_error_handler()
的{{3}}中有相关部分。
使用用户定义的函数无法处理以下错误类型:
E_ERROR
,E_PARSE
,E_CORE_ERROR
,E_CORE_WARNING
,E_COMPILE_ERROR
,{{1} },以及调用E_COMPILE_WARNING
的文件中引发的大多数E_STRICT
。