error_get_last () возвращает NULL в PHP 7, когда установлен специальный обработчик исключений

Хорошо, это заняло некоторое время, чтобы сломать его. Вот:

В оставшейся части этого сообщения есть включенный дефектный скрипт:

faulty.php

<?php $a = 4 // missing semicolon $b = 2; 

Затем рассмотрим следующий скрипт для обработки ошибки. Обратите внимание, что пользовательский обработчик исключений изначально не зарегистрирован.

script.php

 <?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.