Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lopp.DOC
Скачиваний:
6
Добавлен:
31.03.2015
Размер:
187.39 Кб
Скачать
    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 прерывается и начинается выполнение операторов от А до М. Таким образом, операторы АМ будут выполнены только при возникновении исключительной ситуации и должны обеспечить ее обработку и восстановление работоспособности программы. Покажем это на примере. Окно приложения приведено на рис. 9.1.

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

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

procedure TForm1.Button1Click(Sender: TObject);

Var

i:integer;

begin

try

{Преобразование символьной строки в число, }

{возможна исключительная ситуация}

i:=StrToInt(Edit1.Text);

except {Начинается часть обработки исключительной ситуации}

{выдается сообщение о причине возникновения исключительной ситуации}

ShowMessage ('Вы должны ввести целое число');

Edit1.SetFocus;

{Активным становится окно Edit1 для ввода нового значения }

end;

end;

При запуске этого миниприложения из cреды Delphi обработка исключительной ситуации выполняется самой средой и на экране появится сообщение (рис. 9.2.):

Рис. 9.2. Сообщение об исключительной ситуации

Обратите внимание на последнее предложение в сообщении (Use Step or Run to continue). Если вы закроете окно сообщения и нажмете на функциональную клавишу F7 – Step (Что это за клавиша? Мы об этом говорили!), то синяя полоса появится на строке программы, которая следует за вызвавшей исключительную ситуацию строкой. Таким образом, легко определить место возникновения исключительной ситуации, а причина видна из сообщения, выданного Delphi. Что случится при нажатии на функциональную клавишу F9 – Run при наличии и отсутствии блока try except? Запустите и попробуйте!

Delphi позволяет создать законченное приложение, которое может быть запущено прямо из операционной системы. Для этого сначала необходимо запомнить файл проекта и файлы всех модулей (Как это делать, было рассмотрено выше) и создать файл с исполняемой программой (*.exe файл). Для создания *.exe файла необходимо выбрать из меню Delphi пункт Project и подпункт Build all. В результате будет создан *.exe файл с тем же именем, которое мы присвоили файлу проекта. При запуске приложения из Windows 95 и наборе неправильных символов в окне редактирования на экране появится сообщение, приведенное на рис. 9.3 и приложение будет ждать ввода нового значения.

Рис. 9.3. Пример обработки исключительной ситуации

Можно возразить, что то же самое достигается применением вместо функции StrToInt( ) процедуры val( ) и условных операторов, но это затрудняет слежение за логикой программы и при наличии большого количества преобразований заметно удлиняет программу.

В Delphi разрешены и вложенные блоки tryexcept и try finally. Предлагаем читателю самостоятельно разобраться, как будет работать приведенная ниже процедура при возникновении исключительной ситуации и без этого:

procedure TForm1.Button1Click(Sender: Tobject);

Var

i, j, k : integer;

ptr : pointer;

Begin

i:=0;

j:=0;

GetMem (ptr, 4098);

try

try

k:= j div i;

except

ShowMessage(‘Ошибка деления’);

end;

finally

FreeMem (ptr, 4098);

end;

End;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]