Смекни!
smekni.com

Обработка ошибок в коде программ РНР (стр. 1 из 8)

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

РОССИЙСКИЙ ХИМИКО-ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ

им. Д.И. Менделеева

НОВОМОСКОВСКИЙ ИНСТИТУТ

ОБРАБОТКА ОШИБОК В КОДЕ ПРОГРАММ PHP

УЧЕБНОЕ ПОСОБИЕ

Новомосковск 2008
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

РОССИЙСКИЙ ХИМИКО-ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ

им. Д.И. Менделеева

НОВОМОСКОВСКИЙ ИНСТИТУТ

ОБРАБОТКА ОШИБОК В КОДЕ ПРОГРАММ PHP

УЧЕБНОЕ ПОСОБИЕ

Составитель: В. С. Прохоров
Содержание

ВВЕДЕНИЕ

1. КОНТРОЛЬ ОШИБОК

1.1 РОЛИ ОШИБОК

1.2 ВИДЫ ОШИБОК

1.2.1 НЕСЕРЬЕЗНЫЕ ОШИБКИ

1.2.2 СЕРЬЕЗНЫЕ ОШИБКИ

1.2.2.1 Прекращение выполнения программы

1.2.2.2Возврат недопустимого значения

1.2.2.3 Ненормальное состояние программы

1.2.2.4 Вызов функции-обработчика

1.3 ДИРЕКТИВЫ РНР КОНТРОЛЯ ОШИБОК

1.3.1 ДИРЕКТИВА error_reporting

1.3.2 ДИРЕКТИВА display_errors

1.3.3 ДИРЕКТИВА error_log

1.4 УСТАНОВКА РЕЖИМА ВЫВОДА ОШИБОК

1.5 ОПЕРАТОР ОТКЛЮЧЕНИЯ ОШИБОК

1.5.1 ПРИМЕР ИСПОЛЬЗОВАНИЯ ОПЕРАТОРА @

1.5.2 ПРЕДОСТЕРИЖЕНИЯ ПО ПРИМЕНЕНИЮ ОПЕРАТОРА ОТКЛЮЧЕНИЯ ОШИБОК @

2 ПЕРЕХВАТ ОШИБОК. МЕТОД РЕГИСТРАЦИИ ОБРАБОТЧИКА ОШИБОК

2.1 ФУНКЦИЯ set_error_handler

2.2 ФУНКЦИЯ restore_error_handler()

2.3 ПРОБЛЕМЫ С ОПЕРАТОРОМ @

2.4 ГЕНЕРАЦИЯ ОШИБОК

2.5 СТЕК ВЫЗОВОВ ФУНКЦИЙ

2.6 ПРИНУДИТЕЛЬНОЕ ЗАВЕРШЕНИЕ ПРОГРАММЫ

2.7 ФИНАЛИЗАТОРЫ

3. ПЕРЕХВАТ ОШИБОК. МЕТОД ИСКЛЮЧЕНИЙ

3.1 БАЗОВЫЙ СИНТАКСИС

3.2 ИНСТРУКЦИЯ throw

3.3 РАСКРУТКА СТЕКА

3.4 ИСКЛЮЧЕНИЯ И ДЕСТРУКТОРЫ

3.5 ИСКЛЮЧЕНИЯ И set_error_handler()

3.6 КЛАССИФИКАЦИЯ И НАСЛЕДОВАНИЕ

3.7 БАЗОВЫЙ КЛАСС Exception

3.8 ИСПОЛЬЗОВАНИЕ ИНТЕРФЕЙСОВ

3.9 БЛОКИ-ФИНАЛИЗАТОРЫ

3.9.1 Неподдерживаемая конструкция try...finally

3.9.2 "Выделение ресурса есть инициализация"

3.9.3 Перехват всех исключений

3.10 ТРАНСФОРМАЦИЯ ОШИБОК

3.10.1 Серьезность "несерьезных" ошибок

3.10.2 Преобразование ошибок в исключения

3.10.3 Код библиотеки PHP_Exceptionizer

3.10.4 Иерархия исключений

3.10.5 Фильтрация по типам ошибок

3.10.6 Перспективы

ЗАКЛЮЧЕНИЕ

ЛИТЕРАТУРА


ВВЕДЕНИЕ

Имеется мнение: "В любой программе есть хотя бы одна ошибка". На практике "хотя бы одна" означает "много" или даже "очень много".

Фаза "избавления" программы от ошибок (фаза отладки) является наиболее длительной и трудоемкой. Основное времяпровождение программиста (и не только) — это борьба с ошибками.

Одна из самых сильных черт РНР — возможность отображения сообщений об ошибках прямо в браузере. В зависимости от состояния интерпретатора сообщения будут выводиться в браузер или подавляться.

Для успешной борьбы с ошибками нужно научиться управлять настройками РНР, узнать о его тонких местах и о возможностях основных директив. Отдельное внимание следует уделять методикам отладки скриптов, а точнее — обработке сообщений об ошибках и предупреждений, которые могут возникнуть во время работы программы, а также выводу стека вызовов процедур (подобного тому, что существует в языках Java и Perl). Следует с осторожностью использовать оператор отключения предупреждений об ошибках.

Задача обработки ошибок в коде программы - одна из самых важных и популярных при программировании. Для ее успешного решения требуется уточнить понятие термина "ошибка" и определить его роль в программировании, а также изучить различные классификации ошибочных ситуаций. Эта задача может быть эффективно решена при использовании понятия "исключение" и способов применения конструкции try...catch. Использование механизма наследования и классификации исключений может сильно сократить код программы и сделать его универсальным. Существуют коды библиотек, позволяющих обрабатывать многочисленные ошибки и предупреждения, генерируемые функциями РНР, как обыкновенные исключения.

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


1. КОНТРОЛЬ ОШИБОК

Термин "ошибка" имеет три различных значений:

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

2. Внутреннее сообщение об ошибке ("внутренняя ошибка"), которую выдает РНР в ответ на различные неверные действия программы (например, открытие несуществующего файла).

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

3. Пользовательское сообщение об ошибке ("пользовательская ошибка"), к которой причисляются все сообщения или состояния, генерируемые и обрабатываемые самой программой. Например, в скрипте авторизации ситуация "введен неверный пароль" — ошибка именно такого рода.

1.1 РОЛИ ОШИБОК

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

Для записи сообщений об ошибках в журнал в РНР существуют специальные средства: директивы log errors, error log, а также функция error log () (подробнее см.п.п. 1.3.2, 1.3.3).

Пользовательское сообщение об ошибке предназначено для отображения пользователю — отсюда и его название. При возникновении ошибочной ситуации такого рода пользователь должен увидеть осмысленный текст в браузере, а также, возможно, советы, что же ему теперь делать. Не рекомендуется противопоставлять пользовательские ошибки внутренним — часто они могут в какой-то степени перекрываться. Например, при невозможности соединения с SQL-сервером в программе допустима генерация сразу двух видов сообщений:

● внутреннее сообщение: ответ SQL-сервера, дата и время ошибки, номер строки в программе и т. д.;

● пользовательское сообщение: например, текст "Ошибка соединения с SQL-сервером, попробуйте зайти позже".

1.2 ВИДЫ ОШИБОК

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

$f = @fopen("spoon.txt", "r");

if (!$f) return;

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

В данной терминологии диагностические сообщения, которые выдает РНР, также можно назвать кодом восстановления.

Ошибки по своей "серьезности" можно подразделить на два больших класса:

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

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

Для серьезных ошибок необходимо вручную писать код восстановления и прерывать обычный ход программы, в то время как для ошибок несерьезных ничего особенного делать не нужно.

1.2.1 НЕСЕРЬЕЗНЫЕ ОШИБКИ

Для обработки нефатальных ошибок, после которых не требуется "персональное" восстановление, в РНР имеется инструмент, называемый установкой обработчика ошибок (или перехватом ошибок; подробнее см. п. 2).

Метод заключается в том, что в программе пишется специальная функция — обработчик ошибки, которая вызывается РНР всякий раз, когда наступает та или иная ошибочная ситуация. Задача обработчика — сохранить где-нибудь информацию об ошибке или же просто вывести ее в браузер, красиво оформив.

1.2.2 СЕРЬЕЗНЫЕ ОШИБКИ

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

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

Главный вопрос при работе с серьезными ошибками — написание кода восстановления. Он должен иметь достаточный контроль над ходом выполнения программы (например, мог выполнять инструкции return или break, а не только лишь завершал программу по exit ()).