1

我之所以选择这个标题,是因为我遇到了与此处所述完全相同的问题: PHP exceptions throwing in error handler are not catch by exception handler

作者接受了说他显然做错了什么的答案。我的错误和异常处理程序在过去两年中运行良好,但现在我面临着完全相同的问题。我做了代码更新和服务器更新(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 设置?

4

1 回答 1

2

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

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

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

作为一种解决方法(取决于您的需要),您可以使用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 块一样工作,但事实并非如此。没错,如果发生异常并且未定义 catch 块,则程序流将接管异常处理程序,该处理程序可能会优雅地关闭脚本 - 但不会更多。如果您想以正确的方式处理异常,请使用try / catch


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

于 2013-10-01T23:07:01.443 回答