Обработка исключений - часть 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;
Могут возникнуть следующие случаи: