Защита
ресурсов
и регенерация исключений
Иногда бывает необходимо
после обработки исключительной ситуации вызвать стандартный обработчик ошибки.
Например, в случае возникновения некоторой ошибки вы хотите, чтобы приложение
сообщало пользователю какую-либо информацию, а затем передавало управление стандартному
обработчику ошибок. Как вы уже знаете, после обработки исключения вашим кодом
исключение уничтожается. Для того чтобы самостоятельно вызвать снова это исключение,
можно воспользоваться регенерацией исключений. Для регенерации исключения
служит команда raise
, рассмотренная в листинге 9.5.
Листинг 9.5.Регенерация
исключения
try
{ операторы } except
{операторы обработки исключения} raise; // Регенерация исключения end; end;
on <класс исключения> do begin
После выполнения операторов
обработки исключения, написанных программистом, выполняется команда raise
,
которая снова принудительно вызывает это исключение, после чего управление передается
стандартному обработчику исключений.
В случае, если исключение
успешно проходит через все блоки try
в коде приложения, вызывается
метод HandleException
. Он показывает диалоговое окно ошибки. Вы
можете вызвать этот метод так, как показано в листинге 9.6.
Листинг 9.6.Вызов метода
HandleException
try{ операторы } except
Application,HandleException(Self); end;
Теперь рассмотрим конструкцию,
предназначенную для защиты ресурсов приложения.
Конструкция try ...
finally
служит для защиты кода, записанного в разделе finally
от исключительных ситуаций, которые в силу каких-либо причин могут происходить
в разделе try
. Синтаксис этой конструкции представлен в листинге
9.7.
Листинг 9.7.Конструкция
try...finally
try
{операторы, способные создать исключительную ситуацию}; finally
{защищенные операторы, выполняемые в любом случае}; end;
Таким образом, операторы,
которые размещены после ключевого слова finally
, будут выполняться
в любом случае, независимо от того, была сгенерирована исключительная ситуация
или нет.
Если в разделе try
была сгенерирована исключительная ситуация, то управление немедленно передается
разделу finally
. Если исключительной ситуации в разделе try
не было, блок finally
все равно будет выполняться. Даже если в
разделе finally
произойдет ошибка, выполнение операторов этого
раздела будет продолжено до конца без выдачи сведений об ошибке.
В конструкции try
. . . finally
не происходит обработки исключений, она используется в
основном для освобождения ресурсов памяти. Таким образом, в данной конструкции
нуждаются операции с файлами, памятью, ресурсами операционной системы и объектами.
Код обработки исключения
можно разбить на блоки try . . . except . . . end
и try .
. . finally . . . end
. Эти блоки могут быть вложенными (рис. 9.3).
Рис.
9.3. Вложенные блоки в обработчике исключений (а) и в конструкции защиты кода
(б)
При разработке приложений
в среде Kylix могут возникнуть ситуации, когда программисту не требуется обрабатывать
исключения, а необходимо лишь прервать нежелательное действие, вызывающее ошибку.
Для этого применяются так называемые молчаливые исключения (silent exceptions).
Молчаливые исключения
— это исключения, которые не отображают на экране сведений о том, что произошла
ошибка. В результате будет пропущена команда, которая вызвала исключение, и
приложение будет работать дальше.
Молчаливые исключения являются
потомками стандартного исключения EAbort.
По умолчанию обработчик
ошибок CLX Kylix отображает на экране диалоговое окно ошибки для всех исключений,
кроме наследников EAbort
.
Примечание
При создании консольных приложений сведения об ошибке выводятся и для необработанных исключенийEAbort
.
Для того чтобы сгенерировать
молчаливое исключение, можно вызвать процедуру Abort
. Она автоматически
сгенерирует исключение EAbort
, которое прервет текущую операцию
без вывода сведения об ошибке на экран. Рассмотрим пример. Пусть форма содержит
пустой список ListBox1
и кнопку Button1 (рис. 9.4).
Рис. 9.4. Форма с пустым списком и кнопкой Button1
Запишем в обработчик события
кнопки OnClick
следующий код (листинг 9.8):
Листинг 9.8. Генерация
молчаливого исключения
procedure TForm1.Button1Click(Sender: TObject); var
I: Integer; begin for I := 1 to 10 do {цикл 10 paз} begin
ListBox1.Items.Add(IntToStr(I)); {добавляем номер в список} if I = 7 then Abort; {прерываем добавление номеров в список после
добавления седьмого номера} end; end;
Запустим программу. В результате
работы программы, после нажатия кнопки Button1, в список будет добавлено
семь строк с номерами от 1 до 7 (рис. 9.5).
Если нажать кнопку несколько
раз, то в список будут добавлены новые строки с номерами от 1 до 7 после имеющихся
(рис. 9.6).
Рис.
9.5. Результат выполнения программы генерации молчаливого исключения
Рис.
9.6. Результат многократного нажатия кнопки Button1