我们软件的入口点(前端控制器)包含在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!'
我怎样才能达到我想要的目标?
答案 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()的文件。