Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методическое пособие для самостоятельных работ.doc
Скачиваний:
22
Добавлен:
16.11.2019
Размер:
2.89 Mб
Скачать

Глава 7. Исключительные ситуации

Исключительной ситуацией (exception) называется необычная или неожиданная ситуация, прерывающая нормальную работу программы. Генерация исключительной ситуации – уведомление о необычной или неожиданной ситуации. Обработка исключительной ситуации – нахождение выхода из возникшей ситуации и восстановление работоспособности программы.

С исключительными ситуациями мы уже встречались в рассмотренных нами примерах. Например:

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

Попытка открытия несуществующего в заданной директории файла тоже вызывает исключительную ситуацию.

7.1. Обработка исключительных ситуаций

При запуске нашего приложения из среды Delphi можно не беспокоиться об обработке исключительных ситуаций: это делает среда сама и выдает сообщение о природе возникшей ситуации и указывает на место, где это произошло. Если сообщение не появилось, то войдите в меню Delphi, пункт Tools подпункт Options и включите опцию Break on exception. Нашей конечной целью является создание законченных приложений, которые можно запускать прямо из операционной системы Windows 95, без предварительного входа в Delphi. Поэтому мы должны предусмотреть в них и обработку по меньшей мере наиболее вероятных исключительных ситуаций. В противном случае при возникновении исключительной ситуации наше приложение просто остановится, возможно с потерей данных.

Различают:

  • завершение при исключениях;

  • обработку исключений.

Завершение при исключениях обеспечит завершение программы без каких-либо специальных действий. Типичными примерами являются операции ввода/вывода, выделение и освобождение памяти. Возникла при этих операциях исключительная ситуация или нет, в любом случае файлы должны быть закрыты, а выделенная память освобождена. Для этого используется блок try ¼ finally:

try

оператор1;

оператор2;

. . . . . . . . .

операторN;

finally

операторА;

. . . . . . . .

операторМ;

end;

Если при выполнении операторов 1¼N исключительная ситуация не возникла, то выполняются все операторы от 1 до N и затем от А до М. Если при выполнении какого-либо оператора от 1 до N возникла исключительная ситуация, то выполнение операторов из этой последовательности прерывается и начинается выполнение операторов из последовательности А¼М. Такая конструкция обеспечит завершение независимо от того, возникла исключительная ситуация или нет. В противном случае при возникновении последней выполнение программы прерывается и операторы от А до М тоже не будут выполнены. Рассмотрим это на простом примере.

procedure TForm1.Button1Click(Sender: Tobject);

Var

I, j, k : integer;

ptr : pointer; {Переменная – указатель}

Begin

i:=0;

j:=0;

GetMem (ptr, 4098);

{Выделение памяти и присвоение ее адреса переменной ptr}

try

k:= j div i; {Оператор, при выполнении которого может возникнуть ИС}

finally

FreeMem (ptr, 4098); {Освобождение занятой ранее памяти}

end;

End;

В этой процедуре три “безопасных” с точки зрения возникновения исключительной ситуации оператора находятся вне блока try. Операция деления может стать причиной возникновения исключительной ситуации и находится внутри блока try. Если деление выполнено нормально, то все операторы процедуры выполняются подряд, как будто и нет блока try¼finally. При возникновении исключительной ситуации оператор освобождения памяти в любом случае выполняется. При отсутствии блока try¼finally при возникновении исключительной ситуации выполнение процедуры прервалось бы и память осталась бы занятой.

Обработка исключений выполняется блоком

try

оператор1;

. . . . . . . . . . . . . .

операторN;

except

операторА;

. . . . . . . . . . . . . . .

операторМ;

end;

Предполагаем, что исключительная ситуация может возникнуть при выполнении операторов от 1 до N. Если она не возникла, то операторы от 1 до N будут выполнены и этим выполнение заканчивается. Если возникла при их выполнении исключительная ситуация, то выполнение последовательности операторов 1¼N прерывается и начинается выполнение операторов от А до М. Таким образом, операторы А¼М будут выполнены только при возникновении исключительной ситуации и должны обеспечить ее обработку и восстановление работоспособности программы. Покажем это на примере. Окно приложения приведено на рис. 7.1.

Рис. 7.1. Окно ввода

Окно предназначено для ввода одного числового значения, реализация кнопки Do:

procedure TForm1.Button1Click(Sender: TObject);

Var