Хорошо, это заняло некоторое время, чтобы сломать его. Вот:
В оставшейся части этого сообщения есть включенный дефектный скрипт:
<?php $a = 4 // missing semicolon $b = 2;
Затем рассмотрим следующий скрипт для обработки ошибки. Обратите внимание, что пользовательский обработчик исключений изначально не зарегистрирован.
<?php // disable default display of errors ini_set('display_errors', 0); // register functions #set_exception_handler('catchException'); // initially not set register_shutdown_function('catchError'); // define error function function catchError(){ echo "PHP version: ".phpversion(); if(is_null(error_get_last())) echo "<h1>No errors fetched!</h1>"; else echo "<h1>Error fetched:</h1>"; var_dump(error_get_last()); } // define exception function (not used in all examples) function catchException(){} // include faulty script include("D:/temp/faulty.php");
Результаты для PHP 5 и 7 идентичны. Функция error_get_last () возвращает последнюю возникшую ошибку ( Снимок экрана ).
Теперь мы устанавливаем пользовательскую функцию, раскомментирующую строку
set_exception_handler('catchException');
Это отлично работает в PHP 5, однако в PHP 7 error_get_last()
возвращает NULL
( Снимок экрана ).
Почему это? Особенно запутанно, поскольку пользовательский обработчик исключений пуст, например, не «успешно обрабатывает» ошибку.
Как предотвратить это?
Все самое лучшее и спасибо за подсказки!
Дело (на самом деле не проблема) в том, что PHP 7 генерирует исключение типа ParseError, а затем создает ошибку. Таким образом, лучше всего обрабатывать обработчик исключений. Создайте хороший обработчик исключений, чтобы хорошо справляться с этим исключением:
function catchException($e){ echo "<h1>".get_class($e)."</h1>"; echo $e->getMessage()."<br>"; }
PHP 7 ParseError
исключение ParseError
вместо запуска ошибки типа E_PARSE
. По умолчанию обработчик исключений, по-видимому, вызывает ошибку, если встречается неперехваченное исключение. Однако, если вы замените его на set_exception_handler()
это больше не произойдет, если вы не сделаете это самостоятельно.
См. Документы PHP :
PHP 7 изменяет, как большинство ошибок сообщается PHP. Вместо того, чтобы сообщать об ошибках с помощью традиционного механизма отчетности об ошибках, используемого PHP 5, большинство ошибок теперь сообщается путем исключения исключений Error.