Как поймать неопределенные функции с set_error_handler в PHP

Я беру прыжок: мои Сценарии PHP ВСЕ перестанут работать корректно!

По крайней мере, это - то, на что я надеюсь...'

Я не хочу переносить (практически) каждую строку в try...catch операторы, таким образом, я думаю свой лучший выбор, должны сделать пользовательский обработчик ошибок в течение начала моих файлов.

Я проверяю его на странице практики:

function customError($level,$message,$file,$line,$context) {
    echo "Sorry, an error has occured on line $line.<br />";
    echo "The function that caused the error says $message.<br />";
    die();
}

set_error_handler("customError");

echo($imAFakeVariable);

Это хорошо работает, возвращаясь:

Извините, ошибка произошла на строке 17. Функция, которая вызвала ошибку, говорит Неопределенную переменную: imAFakeVariable.

Однако эта установка не работает на неопределенные функции.

function customError($level,$message,$file,$line,$context) {
    echo "Sorry, an error has occured on line $line.<br />";
    echo "The function that caused the error says $message.<br />";
    die();
}

set_error_handler("customError");

imAFakeFunction();

Это возвращается:

Фатальная ошибка: Звоните в неопределенную функцию: imafakefunction () в/Library/WebServer/Documents/experimental/errorhandle.php на строке 17

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

12
задан Saly 3301 1 October 2019 в 16:03
поделиться

3 ответа

set_error_handler разработан для обработки ошибок с кодами: E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE. Это вызвано тем, что set_error_handler предназначен, чтобы быть методом создания отчетов об ошибках, брошенных пользовательской функцией ошибок trigger_error.

Однако я действительно находил этот комментарий в руководстве, которое может помочь Вам:

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

Это не точно верно. set_error_handler() не может обработать их, но ob_start() может обработать, по крайней мере, E_ERROR.

<?php

function error_handler($output)
{
    $error = error_get_last();
    $output = "";
    foreach ($error as $info => $string)
        $output .= "{$info}: {$string}\n";
    return $output;
}

ob_start('error_handler');

will_this_undefined_function_raise_an_error();

?>

Действительно, хотя об этих ошибках нужно тихо сообщить в файле, например. Надо надеяться, у Вас не будет многих E_PARSE ошибки в Вашем проекте!:-)

Что касается общего сообщения об ошибке, придерживайтесь за Исключениями (я нахожу полезным заставить их соединиться с моей системой MVC). Можно создать довольно универсальное Исключение, чтобы предоставить возможности через кнопки и добавить много описания для уведомления пользователя что случилось.

11
ответ дан 2 December 2019 в 07:23
поделиться

Из документации (добавленный акцент):

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

Вызов неопределенных функций инициировал E_ERROR, таким образом он не может быть обработан ошибочным обратным вызовом (или обработчиками исключений в этом отношении). Все, что можно сделать, установлено error_reporting на 0.

PS при прокрутке собственного обработчика ошибок необходимо заботиться для обработки правильно оператор. Из документации (добавленный акцент):

Важно помнить, что стандартный обработчик ошибок PHP полностью обойден. error_reporting () настройки не будут иметь никакого эффекта, и Ваш обработчик ошибок назовут невнимательным - однако Вы все еще можете считать текущее значение error_reporting и действия соответственно. Особо значимый то, что это значение будет 0, если оператор, который вызвал ошибку, предварительно ожидался оператор контроля ошибок.

2
ответ дан 2 December 2019 в 07:23
поделиться

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

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

Если Вы хотели бы, чтобы Ваши сценарии перестали работать корректно, все еще пишущий им PHP-стиль, попытайтесь поместить всю страницу в функцию и затем назовите его в a try..catch блок.

1
ответ дан 2 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: