【问题标题】:Catching fatal PHP errors and throwing an exception捕获致命的 PHP 错误并抛出异常
【发布时间】:2013-09-10 13:43:40
【问题描述】:

我们软件的入口点(前端控制器)包含在一个 try catch 块中,该块捕获异常,然后包含一个 PHP 文件以显示友好的错误页面,并通过电子邮件向我们发送有关异常的信息。这项工作完美无缺,但是它错过了仅显示 HTTP 500 响应的 PHP 致命错误。我试图以与异常相同的方式捕获这些错误。

目前,我们在应用程序的入口点中有这个:

try {
    // Register a shutdown handler for fatal errors
    register_shutdown_function(function() {
        $error = error_get_last();

        // Did this request throw an error that wasn't handled?
        if ($error !== null) {
            throw new Exception('PHP fatal error!');
        }
    });

    // ...normal front controller stuff
} catch (Exception $e) {
    // show fancy error screen with debug information
    include 'themes/error/500.php';
}

在这里,当 PHP 抛出一个致命错误时,我抛出一个异常,希望它被正常的异常处理过程处理。但是,异常永远不会被捕获:

Fatal error: Uncaught exception 'Exception' with message 'PHP fatal error!'

我怎样才能在这里实现我想做的事情?

【问题讨论】:

    标签: php exception


    【解决方案1】:

    您不应该为此使用register_shutdown_function() - 这是没有意义的,因为脚本退出时您已经处于阶段。 PHP 允许您通过set_error_handler() 函数处理错误。

    但请注意,您不能用它来处理致命错误(例如调用未定义的函数)——当然,解析错误也是如此:

    以下错误类型无法用用户定义的方式处理 功能:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING 和大部分 E_STRICT 在 调用 set_error_handler() 的文件。

    【讨论】:

    • 好的,那么如果register_shutdown_function() 无法处理致命错误,您建议如何处理它们?
    • @ChrisWhite 说它不是“处理”它们是不正确的。 register_shutdown_function() 将在脚本退出时执行(并非在所有情况下 - 外部系统进程终止是一个示例,它不会被触发)。因此,调用它是错误的后果,但不是处理错误的方法。 Native 致命错误在大多数情况下无法处理。
    猜你喜欢
    • 2014-12-26
    • 2012-10-01
    • 2013-07-07
    • 1970-01-01
    • 2014-08-26
    • 2018-11-15
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多