【发布时间】:2012-01-18 20:39:55
【问题描述】:
我试图在 PHP 中捕获尽可能多的错误,并以非默认方式正确处理它们。我的问题在这个例子中得到了最好的说明:
<?php
function errorHandler($errno, $errstr, $errfile, $errline){
echo "Error handler here <br>\n";
//throw new Exception($errstr);
}
function shutdownFunction() {
echo "Hi I'm in here <br>\n";
}
set_error_handler("errorHandler");
register_shutdown_function("shutdownFunction");
try {
$undefined->ok(); // causes some error
} catch(Exception $e) {
echo "Caught the exception <br>\n";
}
将此代码作为 PHP 程序运行的结果将表明运行 errorHandler(),打印 PHP 错误(如果“display_errors”设置为“On”),然后运行 shutdownFunction()。
如果我取消注释该异常抛出,就会出现我遇到的问题;我想尽可能频繁地抛出 PHP 错误异常。如果我取消注释 throw 语句,则会调用错误处理程序,这会引发异常,从而导致进一步的错误,从而导致 shutdownFunction() 不被调用。
据我了解,我不能将此错误变成可捕获的异常;但是,我至少想确保调用关闭函数而不限制我将至少 some php 错误作为异常捕获的能力(这意味着我不想删除 throw 中的语句errorHandler())。
我可以在 errorHandler 中做一些检查来检查抛出它是否会导致 shutdownFunction() 被绕过?
【问题讨论】:
-
有趣;唯一对我不起作用的情况是生成了致命错误,但自定义错误处理程序无论如何都无法捕获(来自php.net/set_error_handler:“以下错误类型无法使用用户定义的函数处理:E_ERROR 、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING 以及在调用 set_error_handler() 的文件中引发的大部分 E_STRICT。")。
-
在您提供的代码示例中,比较您尝试
$undefined->ok();与$test = $undefined时发生的情况。当我用后者进行测试时,即使错误处理程序抛出异常,关闭功能仍然会触发。当我用前者进行测试时,错误处理程序和关闭函数都不会触发。
标签: php exception callback shutdown