错误处理程序中抛出的PHP异常未被异常处理程序捕获

时间:2013-10-01 23:00:25

标签: php exception exception-handling plesk

我之所以选择这个标题,是因为我遇到了与此处所述完全相同的问题: PHP exceptions thrown in error handler are not caught 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设置?

1 个答案:

答案 0 :(得分:1)

更新(阅读评论后)。

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

  

使用用户定义的函数无法处理以下错误类型: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()的{​​{3}},尤其是代码示例:

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


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