Ошибка Catch ErrorException, которая обертывает фатальную ошибку PHP

В моей домашней структуре PHP MVC я написал небольшой обработчик ошибок, который обертывает ошибки PHP в исключение, а затем бросает его.

class ErrorController extends ControllerAbstract { ... public static function createErrorException($number, $message = NULL, $file = NULL, $line = NULL, array $context = array()) { throw new ErrorException($message, $number, 0, $file, $line); } } 

Затем регистрируется с помощью set_error_handler() . Это отлично работает, за исключением (не предназначенного для каламбур) фатальных ошибок. Мой пользовательский обработчик ошибок по-прежнему вызывается, но я не могу поймать ErrorException .

Примером такой ошибки будет попытка включить файл, который не существует:

  try { require 'Controller/NonExistentController.php'; } catch (ErrorException $exc) { echo $exc->getTraceAsString(); // code never reaches this block } 

Вызывается мой пользовательский обработчик ошибок и генерируется исключение, но код никогда не достигает блока catch. Вместо этого PHP генерирует HTML (плохо!):

Предупреждение : исключение исключения «ErrorException» с сообщением «require (Controller / NonExistentController.php): не удалось открыть поток: …

С последующим:

Неустранимая ошибка : Program :: main (): Не удалось открыть окно «Контроллер / NonExistentController.php» (include_path = '.:') в …

Я не хочу пытаться восстановить из фатальной ошибки, но я хочу, чтобы мой код вышел изящно. В этом случае это означает отправку ответа XML или JSON, указывающего внутреннюю ошибку, поскольку это приложение REST, и это то, что ожидают мои клиенты. HTML-ответы, скорее всего, также нарушат клиентские приложения.

Должен ли я идти об этом по-другому?

Посмотрите документацию о require на php.net:

требование идентично включению, кроме случаев неудачи, оно также приведет к фатальной ошибке уровня E_COMPILE_ERROR. Другими словами, он остановит скрипт, тогда как включает только предупреждение (E_WARNING), которое позволяет сценарию продолжить.

В вашем случае вы можете обрабатывать фатальные ошибки с помощью register_shutdown_function , для чего требуется PHP 5.2+:

 function customFatalHandler() { $error = error_get_last(); if( $error === NULL) { return; } $type = $error["type"]; $file = $error["file"]; $line = $error["line"]; $message = $error["message"]; echo "Error `$type` in file `$file` on line $line with message `$message`"; } register_shutdown_function("customFatalHandler"); 

Также это может быть полезно для вас

  1. error_get_last () и пользовательский обработчик ошибок
  2. Почему PHP не поймает ошибку «Класс не найден»?

Мне жаль, что у меня есть такой отрицательный ответ, но вы (ОЧЕНЬ ВЕРОЯТНО) не можете.

PHP предназначен для того, чтобы нажимать до тех пор, пока это возможно по какой-то странной причине, у вас есть опечатка? молча инициализируйте эту переменную до нуля, вы ставите [] после чего-то, оцениваете как null, если оператор не имеет смысла!

Это лишний беспорядок с обработкой ошибок, есть как 4 системы в игре, которые не работают вместе. PHP выполняет некоторую обработку ошибок с помощью «патчей обезьян», это вызывает проблему, если вы пытаетесь обработать что-то в обработчике ошибок путем металирования, оно не «не загружается», пока обработчик не выйдет.

С помощью обработчика выключения от него могут возникнуть огромные проблемы! Раньше меня били на задницу, я не хочу об этом говорить: P

Также реализована реализация, определяемая относительно того, закрыты ли файлы «ресурсы» в PHP) при закрытии, она была создана, чтобы помочь подключаемым модулям на веб-серверах. (следовательно, вы можете иметь их список)