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;