3. Распространение.
МAIN
Р1
Р2
Р3
После каждого
перехода на более высокий уровень ИС
захватывает все больше и больше
пространства программы.
4. Обработка и перехват.
Синтаксически
это выглядит так. Любой блок может
завершаться блоком обработки исключений.
Procedure
P3 is
(объявление
переменных)
begin
if
(…) then raise FILE_ERROR;
endif;
exception
(это непосредственно перед end P3)
when имя1 => ……;
when имя2 => ……; обработчики (здесь
могт стоять любые операторы языка
Ада)
……………………..
when
others => ……; (ловушка последней надежды)
end P3;
Ловушки
перебираются сверху вниз. Если какое-то
имя совпало, значит мы перехватили ИС.
Если будет где-то when
FILE_ERROR, то управление
перейдет на этот блок при ИС FILE_ERROR.
procedure
P2 is
(объявление
переменных)
begin
P3 ( );
PUT
(1);
Exception
…………
end P2;
Если
в Р3 мы не нашли обработчика, то ошибочным
считается Р2. Если и там нет обработчика,
то распространиение идет дальше. ИС
считается обработанной после того как
ма нашли обработчик и он отработал. Если
мы не знаем, как исправить ошибку, но у
нас были захвачены какие-то ресурсы, то
мы должны их именно сдесь освободить и
перевозбудить ИС (это делается специальным
оператором raise
без параметров, он может встречаться
только внутри блока обработки ошибок,
он говорит, что ошибка, какая бы она не
была перевозбуждается и идет выше).
Procedure P3 is
X: Integer := F(I);
P := new T;
begin
if (…)
then raise FILE_ERROR;
endif;
exception;
when
…………….;
…………………
when others =>
unchecked deallocation;
end P3;
when
others появляется либо, как
последняя надежда, либо для частичного
исправления ошибки.
Когда
мы пишем блок обработки исключений, мы
должны быть уверены, что все переменные
проинициализированы корректно. Если
исключение произошло в блоке инициализации,
оно сразу же выскакивает на уровень
выше.
К любой
программе на языке Ада априори подключен
блок обработки ИС.
15