Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Исключительные ситуации.doc
Скачиваний:
10
Добавлен:
09.11.2019
Размер:
113.66 Кб
Скачать

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

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

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 завершится.