Защита ресурсов

и регенерация исключений

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

Листинг 9.5.Регенерация исключения

try
{ операторы } except
on <класс исключения> do begin
{операторы обработки исключения} raise; // Регенерация исключения end; end;

После выполнения операторов обработки исключения, написанных программистом, выполняется команда 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-04-1.jpg

Рис. 9.3. Вложенные блоки в обработчике исключений (а) и в конструкции защиты кода (б)

При разработке приложений в среде Kylix могут возникнуть ситуации, когда программисту не требуется обрабатывать исключения, а необходимо лишь прервать нежелательное действие, вызывающее ошибку. Для этого применяются так называемые молчаливые исключения (silent exceptions).

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

Молчаливые исключения являются потомками стандартного исключения EAbort. По умолчанию обработчик ошибок CLX Kylix отображает на экране диалоговое окно ошибки для всех исключений, кроме наследников EAbort.

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

Для того чтобы сгенерировать молчаливое исключение, можно вызвать процедуру Abort. Она автоматически сгенерирует исключение EAbort, которое прервет текущую операцию без вывода сведения об ошибке на экран. Рассмотрим пример. Пусть форма содержит пустой список ListBox1 и кнопку Button1 (рис. 9.4).

9-04-2.jpg

Рис. 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-04-3.jpg

Рис. 9.5. Результат выполнения программы генерации молчаливого исключения

9-04-4.jpg

Рис. 9.6. Результат многократного нажатия кнопки Button1

Hosted by uCoz