Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_ekzamen_po_OOP.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
293.89 Кб
Скачать

29. Порядок выполнения программы и блок finally

try помечает начала защищённого участка кода.

except обозначает конец защищённого участка кода и начало операторов обработки исключения. Синтаксис следующий: on ТипИсключения do.

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

raise позволяет породить исключительную ситуацию.

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

Например, теоретически можно написать следующий код:

Function Ex1(A,B:integer):integer;

Begin

Try

Result:= A div B; //возможно деление на 0

……………….

Result:=Result+1;

Except

On EDivByZero do

Result:=0;

End;

End;

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

Использование блока finally.

Пример:

Будут выполняться длительные вычисления а на экране будет отображаться курсов в виде песочных часов.

Function Tform1.Btn1Click(sender:object);

Var I,j:integer;

Begin

Screen.Cursos:=czHourGlass;

J:=0;

For i:=1000 downto 0 do

J := j + j div I; {деление на 0}

messageDlg(‘Total: ’,+IntToStr(j), mtInformation, [mbOK], 0);

screen.Cursos:=csDefault;

End;

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

Function Tform1.Btn2Click(sender:object);

Var I,j:integer;

Begin

Screen.Cursos:=czHourGlass;

try

J:=0;

For i:=1000 downto 0 do

J := j + j div I; {деление на 0}

messageDlg(‘Total: ’,+IntToStr(j), mtInformation, [mbOK], 0);

finally

screen.Cursos:=csDefault;

End;

В данном случае программа восстановит вид курсора в независимости от того, произошло исключение или нет.

Рассмотренный пример не осуществляет обработку исключения, а просто осуществляет корректный выход из программы. За блоком try может следовать либо блок except либо блок finally, но не оба блока одновременно. В случае, если необходимо также добавить и обработку исключения, то стандартное решение – применить два вложенных блока try.

Пример 3

Function Tform1.Btn3Click(sender:object);

Var I,j:integer;

Begin

Screen.Cursos:=czHourGlass;

Try try

J:=0;

For i:=1000 downto 0 do

J := j + j div I; {деление на 0}

messageDlg(‘Total: ’,+IntToStr(j), mtInformation, [mbOK], 0);

finally

screen.Cursos:=csDefault;

except

on E:EDivByZero do // E – временный объект исключения

begin

raise Exception.Create(‘Ошибка в алгоритме’);

end;

end;

end;

End;

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

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