Я беру прыжок: мои Сценарии 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
Почему мой пользовательский обработчик ошибок не ловит неопределенные функции? Есть ли другие проблемы, которые это вызовет?
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). Можно создать довольно универсальное Исключение, чтобы предоставить возможности через кнопки и добавить много описания для уведомления пользователя что случилось.
Из документации (добавленный акцент):
Следующие ошибочные типы не могут быть обработаны с определяемой пользователем функцией: 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, если оператор, который вызвал ошибку, предварительно ожидался оператор контроля ошибок.
Почему мой пользовательский обработчик ошибок не ловит функции undefinedd? Есть ли другие проблемы, которые это вызовет?
В предположении я сказал бы, что неопределенные функциональные ошибки перемещаются через другой путь выполнения, чем другие ошибочные типы. Возможно, разработчики PHP могли сказать Вам больше, кроме я сомневаюсь, что PHP всегда разработан.
Если Вы хотели бы, чтобы Ваши сценарии перестали работать корректно, все еще пишущий им PHP-стиль, попытайтесь поместить всю страницу в функцию и затем назовите его в a try..catch
блок.