捕获致命的PHP错误并抛出异常

时间:2013-09-10 13:43:41

标签: php exception

我们软件的入口点(前端控制器)包含在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!'

我怎样才能达到我想要的目标?

1 个答案:

答案 0 :(得分: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()的文件。