Почему в PHP не работает shutdown_function?

Есть такой код:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
 
set_error_handler ( function ($errno, $errstr, $errfile, $errline ) 
    {
        echo $errstr;
        throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
        return true;
    });

// shutdown
register_shutdown_function( function(){ 
       echo "END SCRIPT";
});
 
$a->ee();


Общий смысл такой: все ошибки перехватываемые превращаем в исключения. Для перехвата фатальных ошибок будет использоваться shutdown_function.
На простых тестах всё работает, проблема возникает на ошибках вида $a->ee(); здесь идут подряд две ошибки, сначала Undefined variable: a которая превращается в exception и следом Fatal error: Call to a member function ee() on a non-object .
Две странности: во-первых не перехваченное исключение не остановило код в тот же момент, следующее выражение (вызов несуществующего метода) тоже выполнилось. Во-вторых, shutdown_function не вызывается.
Что происходит ?
  • Вопрос задан
  • 2533 просмотра
Пригласить эксперта
Ответы на вопрос 2
BuriK666
@BuriK666
Компьютерный псих
Undefined variable: aPHP Warning:  Uncaught exception 'ErrorException' with message 'Undefined variable: a' in /tmp/aaa.php:17
Stack trace:
#0 /tmp/aaa.php(17): {closure}(8, 'Undefined varia...', '/tmp/aaa.php', 17, Array)
#1 {main}
  thrown in /tmp/aaa.php on line 17
PHP Stack trace:
PHP   1. {main}() /tmp/aaa.php:0

Warning: Uncaught exception 'ErrorException' with message 'Undefined variable: a' in /tmp/aaa.php:17
Stack trace:
#0 /tmp/aaa.php(17): {closure}(8, 'Undefined varia...', '/tmp/aaa.php', 17, Array)
#1 {main}
  thrown in /tmp/aaa.php on line 17

Call Stack:
    0.0002     236768   1. {main}() /tmp/aaa.php:0

PHP Fatal error:  Call to a member function ee() on a non-object in /tmp/aaa.php on line 17
PHP Stack trace:
PHP   1. {main}() /tmp/aaa.php:0

Fatal error: Call to a member function ee() on a non-object in /tmp/aaa.php on line 17

Call Stack:
    0.0002     236768   1. {main}() /tmp/aaa.php:0

END SCRIPT

PHP 5.4.31-pl0-gentoo
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
вам надо поиграться с display_errors и error_reporting. Когда вы все это добро в исключения оборачиваете, надо в обработчике и ошибки дефолтные прятать насколько я помню.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы