Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РЭУБД лекции.doc
Скачиваний:
25
Добавлен:
27.08.2019
Размер:
399.36 Кб
Скачать

Обработка исключений

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

Глобальная обработка

Механизм глобальной обработки исключений реализуется через объект Application, который есть в любом приложении. Создание и запуск объекта можно увидеть в файле проекта (.dpr). Одна из функций этого объекта – обеспечение приложения глобальным обработчиком исключений:

  1. При поступлении от ОС сообщения об исключении объект Application генерирует событие OnException типа TexceptionEvent, обработчик которого является глобальным обработчиком исключений.

  2. По умолчанию на это событие реагирует метод HandleException приложения.

  3. В его теле вызывается метод ShowException, который выводит на экран диалоговое окно с описанием возникшего исключения.

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

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

Procedure TForm1.ApplicationEvents1Exception (Sender: TObject; E: Exception);

begin

MessageDlg (E. Message, mtError, [mbOK], 0);

// Ваши инструкции по обработке исключения

end;

Здесь обработка также состоит в кратком информировании пользователя, возможно, освобождении памяти, закрытии файлов.

Локальная обработка

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

  • try … finally;

  • try … except.

Блоки try включают в себя инструкции, при выполнении которых может возникнуть исключение, например, преобразование данных или запись на диск. Конструкции try могут содержать несколько инструкций и быть вложенными друг в друга. Если в любой из инструкций блока try возникает исключение, то управление передается первой из инструкций блока finally.

try

// инструкции, при выполнении которых может возникнуть ошибка

finally

//инструкции, которые должны быть выполнены даже в случае ошибки

end;

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

Так как инструкция try … finally не ликвидирует исключительную ситуацию, то глобальный обработчик выдаст сообщение о характере ошибки.

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

try

//инструкции, при выполнении которых может возникнуть ошибка

except

//инструкции, которые должны быть выполнены в случае ошибки

end;

Если в инструкциях блока try возникает исключение, то управление передается первой из инструкций блока except. Если исключение не возникло, то инструкции блока except не выполняются. При появлении исключения инструкции блока except могут ликвидировать исключительную ситуацию и восстановить работоспособность программы.

Пример

procedure TForm1.btnOpenClick (Sender: TObject);

begin

try

if OpenDialog1.Execute then begin

Table1.Active := False;

Table1.TableName := OpenDialog1.FileName;

Table1.Active := True;

end;

except

MessageDlg('Ошибка открытия таблицы', OpenDialog1.FileName, '!',

mtError, [mbOK], 0);

end;

end;

При нажатии кнопки btnOpen появляется окно выбора файла таблицы БД для открытия. После выбора файла таблицы набор данных Table1 связывается с этой таблицей и выполняется открытие набора данных. Инструкции, управляющие выбором и открытием файла, включены в блок try, так как. возможна ошибка. При ее возникновении выполняется блок except. В примере обработка заключается только в выдаче предупреждения.

Блок except можно разбить на несколько частей с помощью конструкций on … do, позволяющих анализировать класс исключения для его более удобной и полной обработки.

on {Идентификатор: класс исключения} do

{Инструкции обработки исключения этого класса};

else {Инструкции};

Если класс возникшего исключения совпадает с указанным после on, то выполняются инструкции после слова do.

Идентификатор произвольно задается пользователем и является необязательным, т.е. может отсутствовать, при этом не ставится и (:). Идентификатор – это локальная переменная, представляющая собой экземпляр класса исключения, который можно использовать для доступа к объекту возникшего исключения. Эта переменная доступна только внутри on … do.

Если в блоке except расположено несколько инструкций on ... do, то else, располагающийся в конце блока, относится ко всей совокупности конструкций. Инструкции после do и else могут быть составными.

Если какие-либо действия должны быть выполнены независимо от того, произошла ошибка или нет, то удобно использовать инструкцию try...finally. Однако эта конструкция не обрабатывает исключения, а лишь смягчает их последствия. Для локальной обработки внутрь конструкции try...finally можно включить try … except.

Используемые для доступа к данным компоненты TTable и TQuery имеют специальные события для обработки исключений. Например, для компонента TTable такими событиями являются:

  • OnEditError – ошибка редактирования или вставки записи;

  • OnPostError – ошибка закрепления изменений в записи;

  • OnDeleteError – ошибка удаления записи.