OnEZeroDivide do

Except

Try

Except

Try

Except

Try

Except

Try

Begin

Except

Try

Контроль над исключительными ситуациями

Для контроля над исключительными ситуациями в группе операторов Паскаля применяется следующая конструкция:

try

операторы;

except

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

else оператор;

end;

Ключевое слово try (попытка) обозначает начало блока контроля выполнения опе­раторов, следующих до ключевого слова except. В случае возникновения исключи­тельной ситуации происходит обращение к списку классов, перечисленных перед завершающим ключевым словом end. При этом выполняется действие, указанное для соответствующего класса, а затем управление передается первому оператору, следующему за завершающим ключевым словом end. Операторы, оставшиеся в части try, пропускаются. Если исключительные ситуации не встретились, то про­пускаются все действия, следующие за ключевым словом except. Если возникшая ситуация не относится ни к одному из явно обрабатываемых клас­сов, то выполняется команда Паскаля, указанная после ключевого слова else. Часть else в блоке try указывать не обязательно.

Классы исключительных ситуаций, предназначенные для обработки, записываются в следующем формате:

on название-класса do операторы;

Таких классов может быть несколько, например:

Assert( Y <> 5,'' );

X := 100 divY;

onEZeroDivide do ZeroProc;

on EAssertionFailed do

ShowMessage('Ошибка # 22 ' ) ;

X := 0;

end;

elseShowMessage('Непонятно что);

end;

Если в операторе присваивания будет обнаружена попытка деления на ноль (для этого надо, чтобы значение переменной Y было равно 0), то выполнится процедура ZeroРгос, которая должна быть определена ранее. Если же значением переменной Y окажется число 5, то обработчиком исключительных ситуаций будет сгенерирован объект класса EAssertionFailed и выполнится группа операторов в логических скоб­ках. Оператор X := 100 div Y при этом будет пропущен. Если встретится какая-то другая исключительная ситуация, то выведется сообщение Непонятно что.

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

X := Y + Z;

on EIntError do P1;

on EIntOverflow do P2;

end;

Если при выполнении оператора X := Y + Z возникнет ошибка переполнения EIntOverflow, то вызвана, тем не менее, будет подпрограмма Р1, потому что эта ошибка относится также и к классу EIntError, расположенному первым в списке за ключе­вым словом except.

Можно создать единый обработчик для любой исключительной ситуации. Тогда блок tryзаписывается так:

операторы;

действия;

end;

Например:

X := 0;

GlobalProc;

end;

В случае возникновения во время исполнения оператора X := 0 произвольной ис­ключительной ситуации вызывается процедура GlobalProc.

Иногда реализованной программистом обработки ошибки недостаточно. Тогда, указав ключевое слово raiseбез параметра, можно передать управление стандартному обработчику Delphi 7:

X := 100 divY;