Здавалка
Главная | Обратная связь

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

 

Новое ключевое слово – try, используется для обозначения первой части защищенного участка кода. Существует два типа защищенных участков:

try..except

try..finally

 

Блок try ... except служит для обработки конкретных исключительных ситуаций (исключений). Этот блок имеет два наиболее характерных способа записи (полный и сокращенный), первый из которых неформально можно представить в следующем виде:

 

try

СписокОператоров1

except

on Исключение1 do Оператор1;

on Исключение2 do Оператор2;

on ИсключениеN do ОператорN

else

СписокОператоров2

end;

 

Если в процессе работы проекта ошибок времени выполнения не происходит, то наличие блока обработки исключительных ситуаций никакого влияния на работу не оказывает. Если же при выполнении СпискаОператоров1 между зарезервированными словами try и except возникает исключительная ситуация, то выполнение СпискаОператоров1 прерывается, и управление передается в блок обработки исключения, который по структуре похож на оператор case. В случае, когда возникшая исключительная ситуация совпадает с одним из заголовков альтернатив on ... do, то выполняется соответствующий оператор.

 

try

СписокОператоров1

finally

СписокОператоров2

end;

 

Если в процессе обработки СпискаОператоров1 ошибок времени выполнения не происходит, то после обработки последнего оператора этого списка управление естественным образом переходит на первый оператор СпискаОператоров2 блока try ... finally. Если же при выполнении какого-либо оператора СпискаОператоров1 между зарезервированными словами try…except возникает исключительная ситуация, то оставшиеся операторы пропускаются, и управление сразу передается на первый оператор блока обработки исключения.

 

Возможно совместное использование вложенных блоков try ... except и try ... finally. Достигается возможность описания реакции на конкретные исключения с помощью on ... do в блоке try ... except и возможность выполнить завершающую группу обязательных операторов вне зависимости от возникновения каких-либо исключительных ситуаций с помощью блока try ... finally.

 

try

try

СписокОператоров1

except

on Исключение1 do Оператор1;

on Исключение2 do Оператор2;

оn ИсключениеN do ОператорN

else

СписокОператоров2

end;

finally

СписокОператоров3

end;

try

try

СписокОператоров1

finally

СписокОператоров2

end;

except

on Исключение1 do Оператор1;

on Исключение2 do Оператор2;

on ИсключениеN do ОператорN

else

СписокОператоров3

end;

 

Пример:

 

type

ESampleError = class(Exception);

 

var

ErrorCondition :Boolean;

 

procedure C;

begin

writeln('Enter C');

if (ErrorCondition) then

begin

writeln('Raising exception in C');

raise ESampleError.Create('Error!');

end;

writeln('Exit C');

end;

 

procedure B;

begin

writeln('enter B');

C;

writeln('exit B');

end;

 

procedure A;

begin

writeln('Enter A');

try

writeln('Enter A''s try block');

B;

writeln('After B call');

except

on ESampleError do

writeln('Inside A''s ESampleError handler');

on ESomethingElse do

writeln('Inside A''s ESomethingElse handler');

end;

writeln('Exit A');

end;

 

begin

writeln('begin main');

ErrorCondition := True;

A;

writeln('end main');

end.

 

При ErrorCondition = True программа выдаст:

 

begin main

Enter A

Enter A's try block

enter B

Enter C

Raising exception in C

Inside A's ESampleError handler

Exit A

end main

 

 

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

Почти все существующие классы исключительных ситуаций являются наследниками базового класса Exception и не содержат новых свойств или методов. Класс Exception имеет несколько конструкторов, какой из них конкретно использовать - зависит от задачи.

 

Рассмотрим модифицированную процедуру A в нашем примере:

 

...

on E: ESampleError do writeln(E.Message);

...

 

Есть еще один способ доступа к экземпляру exception – использовать функцию ExceptionObject:

 

on ESampleError do

writeln(ESampleError(ExceptionObject).Message);





©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.