【问题标题】:Ensure PHP shutdown function is called确保调用 PHP 关闭函数
【发布时间】: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-&gt;ok();$test = $undefined 时发生的情况。当我用后者进行测试时,即使错误处理程序抛出异常,关闭功能仍然会触发。当我用前者进行测试时,错误处理程序和关闭函数都不会触发。

标签: php exception callback shutdown


【解决方案1】:

从错误处理程序中抛出异常,然后使用set_exception_handler 处理未捕获的异常。

【讨论】:

    【解决方案2】:

    所以我解决这个问题的方法是检查 $errstr 参数是否以“未定义变量”开头 - 如果是,那么我不会抛出异常。我想如果有任何其他错误有类似的问题,我会用这些做同样的事情。我找不到完整的 php 错误列表以及它们的影响,所以它必须是临时的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 2014-07-07
      • 1970-01-01
      相关资源
      最近更新 更多