set_error_handler () не работает для FATAL ошибки - PullRequest
10 голосов
/ 16 декабря 2011

У меня есть простой пользовательский обработчик ошибок, который записывает в файл журнала ошибок некоторую полезную информацию об отладке.

это работает для всего, но не запускается для FATAL ошибки.

Любой способрешить эту проблему?

В настоящее время, чтобы обойти это обстоятельство, я также зарегистрировал функцию отключения, которая проверяет error_get_last()

Ответы [ 3 ]

19 голосов
/ 16 декабря 2011

Нет, это просто ограничение 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() - достойный обходной путь.

5 голосов
/ 16 декабря 2011

Есть только хакерские способы ее решения, например, используя register_shutdown_function() и затем проверяя, произошла ли ошибка внутри этой функции.

PHP имеет log_errors. По какой-то причине вы можете сделать PHP log любую ошибку в системном журнале или файле журнала без единой строки пользовательского кода. Таким образом, использование set_error_handler() для этой цели вообще не требуется, и его следует избегать, если только вам не нужно, например. трассировка стека.

0 голосов
/ 16 октября 2018

Как уже отмечали другие, мы можем использовать 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
...