异常处理程序未捕获错误处理程序中引发的 PHP 异常


PHP exceptions thrown in error handler not caught by exception handler

我选择这个标题是因为我遇到了与这里所说的完全相同的问题:异常处理程序不会捕获错误处理程序中引发的 PHP 异常

提交人接受了答案,说他显然做错了什么。我的错误和异常处理程序在过去两年中工作正常,但现在我面临着完全相同的问题。我做了代码更新和服务器更新(Plesk 11.5 正在运行,PHP 版本应该相同,是 5.3.2(。我检查了我的代码是否存在错误,但测试清楚地表明这不可能是问题所在:

我编写了以下测试文件:

function errorHandler($errno, $errstr, $errfile, $errline, $errcontext) {
   throw new Exception("this was an error");
}
function exceptionHandler($e) {
   echo 'exceptionHandler';
}
set_error_handler('errorHandler');
set_exception_handler('exceptionHandler');
// test one:
throw new Exception(); // outputs "exceptionHandler"
// test two - uncomment the first test of course! 
$test->blabla();

第二个测试也应该输出"exceptionHandler",但它没有!输出是"致命错误:在第 0 行对 ......./exeptiontest.php 中的非对象调用成员函数 blabla(( ">

这个问题此刻让我发疯。这里有什么建议吗?任何导致此问题的 PHP 设置?

更新(阅读您的评论后(。

执行错误处理程序后,程序流将返回到发生错误的表达式。但是,将程序流传递回致命失败的脚本是不可靠的。这就是为什么错误处理程序不会在致命错误时被调用的原因。文档说:

以下错误类型无法使用用户定义的函数处理:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING,其中大部分E_STRICT在调用 set_error_handler(( 的文件中引发。

作为解决方法(根据您的需要(,您可以使用 register_shutdown_function() 定义关机功能。


原始答案(事实证明这不是这里的问题(

你需要仔细阅读set_exception_handler()的文档,尤其是代码示例:

function exception_handler($exception) {
  echo "Uncaught exception: " , $exception->getMessage(), "'n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Not Executed'n";

这意味着在您的情况下,$test->blabla()永远不会被执行。

您可能期望异常处理程序函数的工作方式类似于 catch 块,但事实并非如此。True 是,如果发生异常并且没有定义 catch 块,程序流将接管异常处理程序,该处理程序可能会优雅地关闭脚本 - 但不会更多。如果要以正确的方式处理异常,请使用try / catch


只是为了更清楚:异常处理程序的行为与错误处理程序不同。从异常处理程序返回后,程序将终止,而程序流在从错误处理程序返回时出错后返回到表达式。