IPHosting (платный профессиональный хостинг)

Здравствуйте, Гость

Главная страница » Интернет-бизнес » Обработка ошибок в PHP

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

Добавлено: Гость | 22.07.2009
Просмотров: 13624
Слов: 804
Рейтинг: 0.00


PHP5 предлагает нам мощный и гибкий механизм исключительных ситуаций. Однако большая часть библиотек языка выполнена в процедурном стиле и обработка ошибок PHP в них сделана соответственно.

Основное

Ошибки в PHP делятся на несколько типов:
* E_PARSE — синтаксическая ошибка (незакрытая скобка, лишняя запятая, забытые точка с запятой и т.п.). Такие ошибки обычно (но всегда) обнаруживаются сразу, т.к. с ними PHP просто не сможет распарсить программу.
* E_ERROR — «фатальная» ошибка. Дальнейшее выполнение программы невозможно. Примеры: вызов несуществующей функции, неудачная попытка подключения файла через require, повторное объявление класса или функции, неперехваченное исключение.
* E_WARNING — предупреждение. Примеры – обращение к несуществующему файлу, передача в цикл foreach переменной, не являющейся массивом.
* E_NOTICE — уведомление. Чаще всего вызвано использованием необъявленных переменных, обращению к несуществующим элементам массивов.
* E_CORE_ERROR — фатальная ошибка при запуске PHP. Аналогичен E_ERROR, но инициируется ядром.
* E_CORE_WARNING — предупреждение при запуске PHP.
* E_COMPILE_ERROR — ошибка при компиляции.
* E_COMPILE_WARNING — предупреждение при компиляции.
* E_STRICT (появился в PHP 5) — «советы» помогающие сделать ваш код более совместимым с будущими версиями PHP.
* E_RECOVERABLE_ERROR (появился в PHP 5.2) — «поправимая, но потенциально опасная ошибка». Возникает, например, при попытке преобразовать в строку объект, не имеющий метода __toString(), при передаче в функцию аргумента неверного типа (если применяется контроль типов).
* E_DEPRECATED (появился в PHP 5.3) — уведомления об использовании устаревших конструкций, несовместимых с будущими версиями PHP.
Описанные выше типы сообщений инициируются самим PHP. Для установки своих сообщений используется функция trigger_error().

bool trigger_error ( string $error_msg [, int $error_type= E_USER_NOTICE ] )

$error_msg — текст сообщения
$error_type — тип ошибки

Типом такого сообщения может быть
* E_USER_ERROR,
* E_USER_WARNING,
* E_USER_NOTICE,
* E_USER_DEPRECATED (начиная с PHP 5.3).
Поведение при этом аналогично E_ERROR, E_WARNING, E_NOTICE и E_USER_DEPRECATED соответственно.

Настройки вывода ошибок.

Вывод ошибок определяется директивой display_errors. Её значение можно изменять во время выполнения скрипта с помощью функции ini_set(). Однако, на неустранимые ошибки (такие как E_PARSE) эта директива не влияет.

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

int error_reporting ([ int [i]$level[/i] ] )

Параметр $level определяет тип обрабатываемых ошибок. С помощью побитовых операторов можно комбинировать несколько типов:
error_reporting(E_ERROR | E_WARNING | E_PARSE);


— будут показаны E_ERROR, E_WARNING и E_PARSE ошибки.
error_reporting(E_ALL ^ E_NOTICE);


— будут показаны все ошибки, за исключением E_NOTICE.

Константа Е_ALL определяет сразу несколько типов ошибок. Её значение может быть различным в зависимости от версии PHP. Например, до PHP 6 в E_ALL не входит E_STRICT. Что бы быть уверенным, что будут обработаны все возможные ошибки, используйте:
);


Установка собственных обработчиков ошибок.

Стандартное поведение при возникновении ошибки можно изменить.

mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )

$error_handler определяет функцию, которая будет вызываться при возникновении ошибки.
$error_types устанавливает типы обрабатываемых ошибок.

Обработчик может принимать от двух до пяти аргументов:
   1. тип ошибки,
   2. текст сообщения,
   3. файл в котором произошла ошибка,
   4. строка в этом файле
   5. контекст — содержит символьную таблицу участка программы, где произошла ошибка.
Если функция возвращает false, то запускается встроенный обработчик.

Напишем свой простой обработчик:
);


Теперь вызовем какую-нибудь ошибку:
;


Получим сообщение:
Цитата.
Уведомление
Undefined variable: X3
Источник: err.php, line 108

При этом значение error_reporting не учитывается — обрабатываются все возможные ошибки. Но в самом обработчике можно предусмотреть различное поведение в зависимости от этого значения. Так же прерывание работы скрипта следует предусмотреть самостоятельно (если нужно, конечно).

Часто, даже зная файл и строку где произошла ошибка, не всегда ясно что могло её вызвать. В таких случаях полезно увидеть стек вызовов. Для его получения воспользуемся функцией debug_backtrace, которая возвращает массив с информацией о вызванных функциях. Эта информация представляет собой массив, который может следующие ключи:
* function — название функции (или метода),
* line — номер строки,
* file — путь к файлу,
* class — имя класса,
* object — объект (PHP 5.1.1 и выше),
* type — если был вызван метод объекта содержит «->», если статический метод класса — «::», если обычная функция — ничего.
* args — массив аргументов функции.

Добавим в обработчик вывод стека:
;


Вызовем ошибку:
, array());


Получим сообщение:
Цитата.
Уведомление, определенное пользователем
Это уведомление
Источник: err.php, line 132
Стек вызовов:
err.php, line 132: trigger_error("Это уведомление", 1024)
err.php, line 150: callUserNotice("Hello", 123, array (0))

К сожалению, ощибки E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING и большая часть E_STRICT не смогут быть обработаны этой функцией.

Однако, можно воспользоваться функциями register_shutdown_function() и error_get_last()

void register_shutdown_function ( callback $function )

$function определяет имя функции, которая будет вызвана при завершении работы скрипта.

array error_get_last ()

Она возвращает информацию о последней ошибке.
Напишем функцию:
);


Т.о. если программа была завершена из-за фатальной ошибки, будет вызван обработчик myErrorHandler(). Что бы одновременно не производился стандартный вывод ошибок, следует отключить display_errors.  
К сожаленью, перехватить ошибки E_PARSE или получить стек вызовов при этом не удастся.

Вызовем фатальную ошибку:
function callError()
{
   doSomething();
}
callError();


В результате получим:
Цитата.
Фатальная ошибка
Call to undefined function doSomething()
Источник: err.php, line 126
Стек вызовов:
myFatalCatcher()

Полный код с примерами можно найти в приложении.

Альтернативы

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

Об авторе

Святослав Радимов



Условия перепечатки

При репосте статьи "Обработка ошибок в PHP", пожалуйста укажите источник - сайт http://www.iphosting.ru/ (Платный профессиональный хостинг) — и информацию об авторе.
Смотрите также

Что такое виртуальный хостинг?
Каждому владельцу веб-сайта не понаслышке знакома проблема: какой выбрать хостинг? Не секрет, что от хостинга зависит очень многое, а именно - насколько успешно будет работать конкретный веб-сайт.

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