ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Изменение настроек уровня сообщения об ошибках. Генерация собственных ошибок. Обработка ошибок

Обработка ошибок

Изменение настроек уровня сообщения об ошибках

Настройки сообщений об ошибках могут изменяться глобально в файле php.ini либо для каждого сценария в отдельности.

Чтобы изменить уровень сообщений для всех сценариев, необходимо модифицировать следующие четыре строки стандартного файла php.ini:

error_reporting = E_ALL & ~E_NOTICE
display_errors = On
log_errors = Off
track_errors = Off

Стандартные глобальные настройки задают:

  • Вывод всех сообщений, кроме уведомлений.
  • Направление сообщений об ошибках в виде HTML на стандартное устройство вывода.
  • Отсутствие протоколирования сообщений на диске.
  • Отсутствие отслеживания ошибок, сохранение сообщений в переменной $php_errormsg

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

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

Включение опции отслеживания ошибок (track_errors) помогает выявлять ошибки в собственном коде вместо того, чтобы позволить среде РНР предоставлять стандартные функциональные возможности. Хотя РНР выводит информативные сообщения об ошибках, когда возникают сбои, стандартное поведение среды выглядит непривлекательно.

Когда происходит неисправимая ошибка, по умолчанию РНР выводит следующее:

<br>
<b>Тип ошибки</>: сообщение об ошибке в файле <b> путь/имя.php</b> в строке <b> номер строки </d><br>

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

Выводимый HTML-код описывает ошибку, но выглядит непрофессионально. Стиль сообщения об ошибке вряд ли будет соответствовать оформлению сайта. Кроме того, если содержимое страницы отображается в таблице, пользователи Netscape могут вообще не увидеть вывода. Дело в том, что HTML-код, который открывает, но не закрывает элементы таблицы, например:

<table>
<tr><td>
<br>
<b>Тип ошибки</b>: сообщение об ошибке в файле <b>путь/имя.php</b>
в строке <b>номер строки</b><br>

дает в некоторых браузерах пустой экран.

Не обязательно сохранять стандартный режим обработки ошибок РНР либо даже использовать одинаковые настройки для всех файлов. Для изменения уровня сообщений об ошибках в текущем сценарии можно обратиться к функции errorjreporting().

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

// отключение сообщений об ошибках
$old_level = error_reporting(0);
// здесь помещается код, который генерирует предупреждения
// повторное включение режима сообщений об ошибках
error_reporting($old_level);

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

Не стоит отключать сообщения навсегда, поскольку это затруднит поиск и исправление ошибок.

Генерация собственных ошибок

Для генерации собственных ошибок применяется функция trigger_error(). Созданные таким образом ошибки будут обрабатываться так же, как и обычные ошибки РНР.

Функции необходимо передать сообщение об ошибке, а также, необязательно, тип ошибки. Возможен один из следующих типов: E_USER_ERROR, E_USER_WARNING либо E_USER_NOTICE. Если тип не указан, по умолчанию принимается значение E_USER_NOTICE.

Ниже приводится пример использования функции trigger_error():

trigger_error("Этот компьютер самоуничтожится через 15 секунд", E_USER_WARNING);

Обработка ошибок

В языке РНР можно избегать обработки исключений, характерной для программирования на C++ и Java. Исключения позволяют функциям предупреждать об ошибках и задействовать обработчики исключений. Исключения появились только в версии PHP5, и они являются прекрасным способом обработки ошибок, особеннов крупных проектах.

Как уже упоминалось, можно генерировать собственные ошибки, а также поддерживать собственные обработчики ошибок.

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

Функция обработки ошибок должна принимать два параметра — тип ошибки и сообщение. В зависимости от этих двух переменных, функция может выбирать способ обработки ошибки. Тип ошибки должен соответствовать одной из предопределенных констант. Сообщение представляет собой строку описания.

Ниже приводится пример вызова функции set_error_handler():

set_error_handler("my_error_handler");

Указав среде РНР использовать my_error_handler(), необходимо затем подготовить функцию с таким именем. Ниже представлен прототип функции:

my_error_handler (int error_type, string error_msg [ , string errfile [ , int errline [ , array errcontext ] ] ] ) )

Реализуемые ею операции определяются разработчиком.

Параметрами, передаваемыми этой функции, являются:

  • тип ошибки;
  • сообщение об ошибке;
  • файл, в котором возникла ошибка;
  • строка, в которой возникла ошибка;
  • таблица символов, то есть набор всех переменных вместе со значениями на момент возникновения ошибки.

Рассмотрим возможные логические действия, которые может реализовать данная функция:

  • Отображение заданного сообщения об ошибке (error_msg).
  • Сохранение информации в журнальном файле.
  • Отправка сообщения об ошибке по заданному адресу электронной почты.
  • Завершение сценария с помощью оператора exit.

Сценарий, в котором объявляется обработчик ошибок, уста навливается обработчик ошибок с помощью функции set_error_handler(), а затем генерируются ошибки приведен ниже.

handle.php — этот сценарий объявляет пользовательский обработчик ошибок и генерирует различные ошибки

<?php
// Функция обработки ошибок
function my_error_handler ($errno, $errstr, $errfile, $errline)
{
echo "<br /><table bgcolor='#cccccc'><tr><td>
<p><strong>ОШИБКА:</strong> $errstr</p>
<p>Пожалуйста, попытайтесь еще раз, либо свяжитесь с нами
и сообщите, что за ошибка возникла в строке $errline файла '$errfile'</p>"
;
if ($errno == E_USER_ERROR)
{
echo '<p>Эта ошибка является неисправимой, программа завершается</p>';
echo '</td></tr></table>';
// Закрыть все открытые ресурсы, вывести нижний колонтитул страницы
// и так далее...
exit;
}
echo '</td></tr></table>';
}
// Установить обработчик ошибок
set_error_handler('my_error_handler');

// Сгенерировать ошибки различных уровней
trigger_error('Вызвана функция trigger_error', E_USER_NOTICE);
fopen('nofile', 'r');
trigger_error('Этот компьютер уже на издыхании', E_USER_WARNING);
include ('nofile');
trigger_error('Этот компьютер самоуничтожится через 15 секунд', E_USER_ERROR);
?>

Вывод полученный в результате выполнения сценария будет выглядеть так:

С использованием собственного обработчика ошибок можно выводить более дружественные сообщения, нежели PHP

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

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