Разработчику. Сборник рецептов PHP
Задавайте вопросы

Настройка обработки ошибок

Вернуться назад

Задача

Необходимо изменить уровень регистрации ошибок на определенной странице. Это позволяет управлять типом отображаемых ошибок.

Решение

Типы ошибок, на которые будет реагировать PHP, настраиваются с помощью функции error_reporting():

error_reporting(E_ALL);      // все
error_reporting(E_ERROR | E_PARSE);           // только основные проблемы
error_reporting(E_ALL & ~E_NOTICE);           // все, за исключением уведомлений

Обсуждение

Каждая сгенерированная ошибка имеет тип, к которому она относится. Например, если попытаться применить функцию array_pop() к строке, то PHP пожалуется, что«This argument needs to be an array» (Этот аргумент должен быть массивом), поскольку извлекать последний элемент можно только из массивов. С этим сообщением ассоциируется тип ошибки E_NOTICE, а не фатальная ошибка времени выполнения (runtime error).

По умолчанию уровень сообщений об ошибках равен E_ALL & ~E_NOTICE, что означает все типы ошибок, за исключением уведомлений. Символ & – это логическое И, а символ ~ – логическое НЕТ. Однако рекомендованный файл конфигурации php.ini устанавливает уровень сообщения об ошибках, равный E_ALL, что означает все типы ошибок.

Сообщения об ошибках, отмеченные как notice, это ошибки времени выполнения, но не такие серьезные, как предупреждения. Это не обязательно что-то неверное, но они говорят о потенциальной проблеме. Один из примеров ошибки типа E_NOTICE – «Undefined variable»; она случается при попытке использовать переменную без предварительно присвоенного значения:

// Генерирует E_NOTICE
foreach ($array as $value) {
     $html .= $value;

}

// Не генерирует никакого сообщения об ошибках
$html = '';
foreach ($array as $value) {
     $html .= $value;

}

В первом случае при начальном проходе цикла foreach переменная $html не определена. Поэтому когда ее содержимое складывается со значением, PHP сообщает о попытке сложения с неопределенной переменной. Во втором случае пустая строка присваивается переменной $html вне цикла, для того чтобы избежать сообщения E_NOTICE. Предыдущие два программные фрагмента порождают один и тот же код, поскольку по умолчанию значение переменной представляет собой пустую строку. Сообщение E_NOTICE может быть полезным, поскольку можно сделать, например, ошибку в имени переменной:

foreach ($array as $value) {
     $hmtl .= $value; // Ой! Это должна быть $html

}

$html = ''
foreach ($array as $value) {
     $hmtl .= $value; // Ой! Это должна быть $html

}

Пользовательская функция обработки ошибок может анализировать ошибки на основании их типа и предпринимать соответствующие действия. Полный список типов ошибок показан в таблице: Типы ошибок

Таблица:Типы ошибок

Значение Константа Описание Уловимая
1 E_ERROR Неисправимая ошибка Нет
2 E_WARNING Исправимая ошибка Да
4 E_PARSE Синтаксическая ошибка Нет
8 E_NOTICE Вероятная ошибка Да
16; E_CORE_ERROR Подобная E_ERROR, но сгенерированная ядром PHP Нет
32 E_CORE_ WARNING &Подобная E_WARNING, но сгенерированная ядром PHP Нет
64 E_COMPILE_ ERROR Подобная E_ERROR, но сгенерированная Zend Engine Нет
128 E_COMPILE_ WARNING Подобная E_WARNING, но сгенерированная Zend Engine Нет
256 E_USER_ERROR Подобная E_ERROR, но инициированная вызовом функции trigger_error() Да
512 E_USER_ WARNING Подобная E_WARNING, но инициированная вызовом функции trigger_error() Да
1024 E_USER_NOTICE Подобная E_NOTICE, но инициированная вызовом функции trigger_error() Да
2047 E_ALL Все n/a

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

См. также

Документацию по функции error_reporting() на http://www.php.net/error-reporting и по функции set_error_handler() на http://www.php.net/set-error-handler; более подробную информацию об ошибках на http://www.php.net/ref.errorfunc.php.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ