Php set_error_handler()不';因为致命的错误而不能工作

Php set_error_handler()不';因为致命的错误而不能工作,php,error-handling,fatal-error,Php,Error Handling,Fatal Error,我有一个简单的自定义错误处理程序,它在错误日志文件中写入一些有用的调试信息 它的一切工作,但它不会被触发的致命错误 有办法解决这个问题吗 目前为了绕过这种情况,我也注册了一个关机函数,它检查error\u get\u last()不,这只是一个限制;它不能处理所有的错误 无法使用用户定义的函数处理以下错误类型:E\u error、E\u PARSE、E\u CORE\u error、E\u CORE\u WARNING、E\u COMPILE\u error、E\u COMPILE\u WARN

我有一个简单的自定义错误处理程序,它在错误日志文件中写入一些有用的调试信息

它的一切工作,但它不会被触发的致命错误

有办法解决这个问题吗


目前为了绕过这种情况,我也注册了一个关机函数,它检查
error\u get\u last()

不,这只是一个限制;它不能处理所有的错误

无法使用用户定义的函数处理以下错误类型:
E\u error
E\u PARSE
E\u CORE\u error
E\u CORE\u WARNING
E\u COMPILE\u error
E\u COMPILE\u WARNING
,以及调用
set\u error\u handler()的文件中提出的大部分
E\u STRICT


and是一个不错的解决方法。

只有一些黑客的方法可以解决它,例如使用
寄存器\u shutdown\u函数()
,然后检查该函数内部是否发生错误


PHP有一个原因,您可以让PHP将任何错误记录到syslog或日志文件中,而无需一行自定义代码。因此,完全不需要为此目的使用,除非您需要stacktrace。正如其他人所指出的,我们可以按照以下方式使用register\u shutdown\u function()和error\u get\u last()

下面的实现将捕获php 7.1中测试的
\Throwable
甚至没有捕获到的错误。它应该也适用于以前的PHP版本。它应该只在开发环境中实现(只需将其添加到开发配置文件中),而不应该在生产环境中实现

实施


这个问题遗漏了一个链接:。当然,我需要stacktrace和/或其他调试信息,如我的第一篇文章中所述。您给出了使用register_shutdown_function()和error_get_last()作为解决方法的示例,我想不出一个。是否有办法恢复代码发生致命错误?对于错误,表示未定义某些函数。我想使用eval()定义该函数,并将代码恢复到下一个错误。这可能吗?@AhmadAmeri不幸的是,在PHP中发生致命错误后,无法继续。您只能通过此黑客攻击捕获它们,并在它们出现时系统地删除它们。
register_shutdown_function(function () {
    $err = error_get_last();
    if (! is_null($err)) {
        print 'Error#'.$err['message'].'<br>';
        print 'Line#'.$err['line'].'<br>';
        print 'File#'.$err['file'].'<br>';
    }
});
Error# Class Path/To/MyService contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Path/To/MyServiceInterface::add)
Line# 12
File# Path/To/MyService.php