Почему нет ошибки PHP при вызове неопределенной функции? - PullRequest
3 голосов
/ 26 октября 2011

При каждом вызове неопределенной функции ошибки не регистрируются.Вместо этого скрипт просто прекращает выполнение.Что еще хуже, если я запускаю php -l filename.php, он показывает, что нет никаких синтаксических ошибок.Я использую пользовательскую функцию обработчика ошибок, но даже первая строка не достигается.

Как заставить его запускать мой обработчик ошибок при вызове неопределенной функции?

Я использую PHP 5.3.2-1.Вот код, который устанавливает обработчик ошибок:

error_reporting(-1);
$old_error_handler = set_error_handler( "userErrorHandler" );
set_exception_handler('exception_handler');

Ни обработчик ошибок, ни обработчик исключений не достигаются, хотя они работают и для других ошибок.

Причина, по которой я хочуэто значит, что мне приходится размещать операторы отладки в своем коде, чтобы увидеть, как далеко он продвигается, прежде чем он прекратит выполнение, что является медленным процессом по сравнению с сообщением об ошибке, которое сообщит мне номер файла и строки, где находится ошибка.

Ответы [ 2 ]

8 голосов
/ 26 октября 2011

Неустранимые ошибки не могут быть обработаны обработчиком ошибок пользователя.

См. http://php.net/manual/en/function.set-error-handler.php

В частности, деталь:

Следующие типы ошибок не могут бытьобрабатывается с помощью пользовательской функции: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING и большей части E_STRICT, созданного в файле, где set_error_handler () вызывается как * * 101 * * 1010 для * * * * * * * * * * * * * * * * *Страница справочника по PHP, один из обходных путей - проверить ошибки в функции выключения:

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 0);

    function shutdown(){
        $isError = false;
        if ($error = error_get_last()){
            switch($error['type']){
                case E_ERROR:
                case E_CORE_ERROR:
                case E_COMPILE_ERROR:
                case E_USER_ERROR:
                    $isError = true;
                    break;
            }
        }

        if ($isError){
            echo "Script execution halted ({$error['message']})";
        } else {
            echo "Script completed";
        }
    }

    register_shutdown_function('shutdown');
?>
0 голосов
/ 26 октября 2011

В руководстве есть соответствующая часть для set_error_handler().

Следующие типы ошибок не могут быть обработаны пользовательской функцией: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING и большинство E_STRICT, возникающих в файле где set_error_handler() называется.

...