set_error_handler() не работает для FATAL ошибки
У меня есть простой пользовательский обработчик ошибок, который записывает в файл журнала ошибок какую-то полезную информацию об отладке.
он работает для всего, но не запускается для ошибки FATAL.
Любой способ решить эту проблему?
В настоящее время, чтобы обойти это обстоятельство, я зарегистрировал функцию выключения, которая проверяет error_get_last()
Ответы
Ответ 1
Нет, это просто ограничение set_error_handler()
; он не обрабатывает все ошибки.
Следующие типы ошибок не могут быть обработаны с помощью определенной пользователем функции: E_ERROR
, E_PARSE
, E_CORE_ERROR
, E_CORE_WARNING
, E_COMPILE_ERROR
, E_COMPILE_WARNING
и большая часть E_STRICT
, поднятых в файле где set_error_handler()
вызывается.
register_shutdown_function()
и error_get_last()
является достойное обходное решение.
Ответ 2
Есть только хакерские способы его решения, например. используя register_shutdown_function()
, а затем проверяя, произошла ли ошибка внутри этой функции.
PHP имеет log_errors
по какой-либо причине, вы можете сделать PHP-журнал любой ошибкой в syslog или в файле журнала без отдельной строки пользовательского кода, Поэтому использование set_error_handler()
для этой цели вовсе не требуется, и его следует избегать, если вам не нужно, например. stacktrace.
Ответ 3
Как уже отмечали другие, мы можем использовать register_shutdown_function() и error_get_last() следующим образом.
Приведенная ниже реализация будет перехватывать ошибки, которые не \Throwable
как проверено в php 7.1. Это должно работать и для предыдущих версий 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