Справочное руководство по языку Ада-83


Обработка исключений - часть 2


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

г) Для тела задачи — задача становится законченной.

Говорят, что повторно возбужденное исключение (как это рассмотрено в пп. а), б) и в))

распространяется

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

Наконец, если исключение возбуждено в последовательности операторов обработчика исключения, то выполнение этой последовательности операторов прекращается. Последующие действия (включая возможное распространение) зависят от природы окружения и выполняются в соответствии с пп. а) ~ г).

Пример:

function FACTORIAL (N : POSITIVE) return FLOAT is

begin

if N = 1 then

return 1.0; else

return FLOAT(N) * FACTORIAL(N-I); end if; exception

when NUMERIC_ERROR => return FLOATSAPE_LARGE; end FACTORIAL;

Если при умножении возбуждается исключение NUMERIC_ERROR, то значение FLOAT'SAFE- LARGE возвращается обработчиком исключения. Это значение будет вызывать возбуждение исключения NUMERIC_ERROR при вычислении выражения в каждом из оставшихся обращений к этой функции. Таким образом, для больших значений N эта функция всегда будет возвращать значение FLOAT'SAFE-LARGE.

Пример:

procedure P is

ERROR : exception; procedure R;

procedure Q is

begin

R; ... -— ошибочная ситуация 2 exception

... when ERROR => -— обработчик Е2 end Q;

procedure R is

begin

... -— ошибочная ситуация З end R;

begin

... —- ошибочная ситуация 1 Q; ... exception

... when ERROR => -- обработчик Е1 ... end P;

Могут возникнуть следующие случаи:




Начало  Назад  Вперед



Книжный магазин