php - 在异常处理程序未捕获到错误处理程序时,抛出了PHP异常

  显示原文与译文双语对照的内容

因为我的问题与这里所描述的完全相同,所以我选择了这个标题: 错误处理程序中抛出的 PHP异常不会被异常处理程序捕获。

作者接受了回答,他显然在做错误的事情。 过去两年的错误和异常处理程序工作良好,但现在我面对的问题完全相同。 我做了一个代码更新和一个服务器更新( Plesk 11.5运行,PHP版本应该是相同的,并且是 5.3.2 ) 。 我检查了我的错误代码,但是一个测试确定这不可以能是问题:

我编写了以下 testfile:


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上的非对象上调用成员 function blabla()"

这个问题让我 crazy 。 这里有什么建议任何导致这里问题的PHP设置?

时间: 原作者:

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

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

无法使用用户定义的函数处理以下错误类型: 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 Executedn";

也就是说 $test->blabla() 永远不会被执行。

你可能期望异常处理程序函数类似于catch块,但这不是。 true 是,如果发生异常并且没有定义catch块,程序流将接收到异常处理程序。 如果要处理异常,请使用 try/catch


为了让它更加清晰: 异常处理程序的行为与错误处理程序不同。 程序返回到表达式后,程序将在返回错误处理程序后退回表达式。

原作者:
...