exception_handling -> не так надежно, как просто ошибка регистрации?

#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 позволяет указать уровни ошибок, на которых будет запущен обработчик. Первым параметром вашего обработчика является номер уровня ошибки, поэтому вы можете проверить это в обработчике.