set_error_handler()不适用于FATAL错误

时间:2011-12-15 23:09:19

标签: php error-handling fatal-error

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

它适用于所有内容,但不会触发FATAL错误。

有什么方法可以解决这个问题吗?

目前为了绕过这种情况,我已经注册了一个关闭功能,检查error_get_last()

3 个答案:

答案 0 :(得分:19)

不,这只是set_error_handler()的限制;它不处理所有错误。

  

使用用户定义的函数无法处理以下错误类型:E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERROR,{{1} },以及调用E_COMPILE_WARNING的文件中引发的大多数E_STRICT

register_shutdown_function()error_get_last()是一个不错的解决方法。

答案 1 :(得分:5)

只有解决它的黑客方法,例如使用register_shutdown_function(),然后检查该函数内是否发生错误。

PHP有log_errors是有原因的,你可以在没有一行自定义代码的情况下将PHP日志任何错误发送到syslog或日志文件。因此,根本不需要使用set_error_handler(),除非您需要,否则应该避免使用{{3}}。堆栈跟踪。

答案 2 :(得分:0)

正如其他人指出的那样,我们可以按以下方式使用register_shutdown_function()和error_get_last()。

以下实现将捕获php 7.1中测试的\Throwable甚至未捕获的错误。它也应该适用于以前的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