Контроль над исключительными ситуациями
Для контроля над исключительными ситуациями в группе операторов Паскаля применяется следующая конструкция:
try
операторы;
except
обрабатываемые классы исключительных ситуаций;
else оператор;
end;
Ключевое слово try (попытка) обозначает начало блока контроля выполнения операторов, следующих до ключевого слова except. В случае возникновения исключительной ситуации происходит обращение к списку классов, перечисленных перед завершающим ключевым словом end. При этом выполняется действие, указанное для соответствующего класса, а затем управление передается первому оператору, следующему за завершающим ключевым словом end. Операторы, оставшиеся в части try, пропускаются. Если исключительные ситуации не встретились, то пропускаются все действия, следующие за ключевым словом except. Если возникшая ситуация не относится ни к одному из явно обрабатываемых классов, то выполняется команда Паскаля, указанная после ключевого слова else. Часть else в блоке try указывать не обязательно.
Классы исключительных ситуаций, предназначенные для обработки, записываются в следующем формате:
on название-класса do операторы;
Таких классов может быть несколько, например:
try
Assert( Y <> 5, '' );
X := 100 div Y;
except
on EZeroDivide do ZeroProc;
on EAssertionFailed do
begin
ShowMessage('Ошибка # 22 ' ) ;
X := 0;
end;
else ShowMessage('Непонятно что’);
end;
Если в операторе присваивания будет обнаружена попытка деления на ноль (для этого надо, чтобы значение переменной Y было равно 0), то выполнится процедура ZeroРгос, которая должна быть определена ранее. Если же значением переменной Y окажется число 5, то обработчиком исключительных ситуаций будет сгенерирован объект класса EAssertionFailed и выполнится группа операторов в логических скобках. Оператор X := 100 div Y при этом будет пропущен. Если встретится какая-то другая исключительная ситуация, то выведется сообщение Непонятно что.
Поиск класса подходящей исключительной ситуации осуществляется в последовательном порядке. Если возникшую ошибку можно отнести к нескольким классам, то вызван будет обработчик для класса, расположенного первым, например:
try
X := Y + Z;
except
on EIntError do P1;
on EIntOverflow do P2;
end ;
Если при выполнении оператора X := Y + Z возникнет ошибка переполнения EIntOverflow, то вызвана, тем не менее, будет подпрограмма Р1, потому что эта ошибка относится также и к классу EIntError, расположенному первым в списке за ключевым словом except.
Можно создать единый обработчик для любой исключительной ситуации. Тогда блок try записывается так:
try
операторы;
except
действия;
end;
Например:
try
X := 0;
except
GlobalProc;
end;
В случае возникновения во время исполнения оператора X := 0 произвольной исключительной ситуации вызывается процедура GlobalProc.
Иногда реализованной программистом обработки ошибки недостаточно. Тогда, указав ключевое слово raise без параметра, можно передать управление стандартному обработчику Delphi 7:
try
X := 100 div Y;
except
on EZeroDivide do
begin
ShowMessage('Ошибка # 22');
raise;
end;
end ;
После выдачи сообщения Ошибка # 22 исполнится стандартный обработчик ошибки EZeroDivide.
Из текста обработчика ошибки можно генерировать другие исключительные ситуации, например:
try
X := Y + Z;
except
on EIntError do
raise EIntOverflow.Create('Возможно переполнение');
end ;
Если при сложении целых чисел, хранящихся в переменных Y и Z, возникнет какая-то арифметическая ошибка (базовый класс EIntError), то в обработчике этой ошибки будет сгенерирована другая исключительная ситуация EIntOverflow, а обработка ошибки EIntError завершится.
