#exception-handling #php
#исключение #php
Вопрос:
Обработка исключений в php… Я заметил некоторые особенности, которые, похоже, затрудняют правильную реализацию. Во-первых, большинство устаревших функций php сами по себе не генерируют исключения, похоже, нужно реализовать set_error_handler и иметь функции обратного вызова. Хорошо. Небольшое раздражение, но давайте посмотрим, что дает. О! Отлично, теперь все выдает исключение, и, конечно, самое худшее: неперехваченные исключения останавливают скрипт.
Итак, после прочтения руководства и других сообщений здесь стало понятно, что нужно реализовать set_exception_handler, а также иметь обратный вызов set_error_handler, чтобы не вызывать E_NOTICE, E_WARNING.
Пока это правильно? После повторного чтения справочной страницы кажется, что set_exception_handler останавливает скрипт при каждой ошибке, даже исправимой, без возможности продолжения работы скрипта.
Так что, похоже, это не для меня, я не могу заставить скрипты прекращать выполнение из-за уведомлений или предупреждений о событиях.
Существуют ли обходные пути? Мне любопытно узнать, как другие справляются с исключениями и этими проблемами.
Ответ №1:
Это обработчик исключений, который Ларри Уллман написал в своей книге PHP 5 Advanced (отличная книга).
Это устраняет большую часть того, что вы говорите
function my_error_handler ($e_number, $e_message, $e_file, $e_line, $e_vars)
{
global $debug, $contact_email;
$message = "An error occurred in script '$e_file' on line $e_line: n<BR />$e_messagen<br />";
$message .= "Date/Time: " . date('n-j-Y H:i:s') . "n<br />";
$message .= "<pre>" . print_r ($e_vars, 1) . "</pre>n<BR />";
if ($debug)
{
echo '<p class="error">'.$message.'</p>';
}
else
{
error_log($message, 1,$contact_email);
if (($e_number != E_NOTICE) amp;amp; ($e_number < 2048))
{
echo '<p class="error">A system error occurred. We apologize for the inconvenience.</p>';
}
}
}
set_error_handler('my_error_handler');
Примечание: Я только что напечатал это, могут быть опечатки.
Вам нужно будет определить переменные $debug (если true, выводит сообщение об ошибке на веб-страницу) и связаться по электронной почте (если значение $ debug равно false, отправляет электронное письмо на этот адрес об ошибке).
Комментарии:
1. Хорошо, выглядит красиво, но не использует обработку исключений, я полагаю, я мог бы просто добавить одно в последнее предложение if, хотя. Значит, не нужно использовать set_exception_handler, если все исключения перехвачены? Или это используется совместно с set_exception_handler для обработки неперехваченных исключений надлежащим образом?
2. Это «улавливает» исключения, которые не улавливаются ничем другим. Затем это делает это привлекательным для пользователя (без предоставления информации об ошибке) и отправляет администратору электронное письмо со всеми сведениями об ошибке. И да, это работает с set_error_handler() (как set_exception_handler())
Ответ №2:
Вам пришлось бы написать свой обработчик ошибок, чтобы проверить уровень сгенерированной ошибки и решить, следует ли создавать исключение на основе этого.
Второй аргумент для set_error_handler позволяет указать уровни ошибок, на которых будет запущен обработчик. Первым параметром вашего обработчика является номер уровня ошибки, поэтому вы можете проверить это в обработчике.