В моей домашней структуре 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");
Также это может быть полезно для вас
Мне жаль, что у меня есть такой отрицательный ответ, но вы (ОЧЕНЬ ВЕРОЯТНО) не можете.
PHP предназначен для того, чтобы нажимать до тех пор, пока это возможно по какой-то странной причине, у вас есть опечатка? молча инициализируйте эту переменную до нуля, вы ставите [] после чего-то, оцениваете как null, если оператор не имеет смысла!
Это лишний беспорядок с обработкой ошибок, есть как 4 системы в игре, которые не работают вместе. PHP выполняет некоторую обработку ошибок с помощью «патчей обезьян», это вызывает проблему, если вы пытаетесь обработать что-то в обработчике ошибок путем металирования, оно не «не загружается», пока обработчик не выйдет.
С помощью обработчика выключения от него могут возникнуть огромные проблемы! Раньше меня били на задницу, я не хочу об этом говорить: P
Также реализована реализация, определяемая относительно того, закрыты ли файлы «ресурсы» в PHP) при закрытии, она была создана, чтобы помочь подключаемым модулям на веб-серверах. (следовательно, вы можете иметь их список)