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 div Y;
on EZeroDivide do ZeroProc;
on EAssertionFailed do
ShowMessage('Ошибка # 22 ');
X:= 0;
end;
else ShowMessage('Непонятно что’);
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 div Y;