1

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

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

4

1 回答 1

1

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

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

用户定义的函数无法处理以下错误类型:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING,以及在调用 set_error_handler() 的文件中引发的大部分 E_STRICT。

于 2013-09-10T13:46:30.203 回答