我有一个简单的自定义错误处理程序,它在错误日志文件中写入一些有用的调试信息。
它适用于所有内容,但不会触发FATAL错误。
有什么方法可以解决这个问题吗?
目前为了绕过这种情况,我已经注册了一个关闭功能,检查error_get_last()
答案 0 :(得分:19)
不,这只是set_error_handler()
的限制;它不处理所有错误。
使用用户定义的函数无法处理以下错误类型:
E_ERROR
,E_PARSE
,E_CORE_ERROR
,E_CORE_WARNING
,E_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