577
программа, в которой присутствует это указание, должна быть скомпилирована
таким образом, чтобы минимизировать время ее выполнения (TIME) или необходи
мую для ее выполнения память (SPACE).
Исключительные ситуации. В конце каждой программной единицы (подпро
граммы, блока, задачи или пакета) можно определить набор обработчиков исклю
чительных ситуаций. Эти обработчики могут использоваться для обработки ис
ключений, возникающих как внутри этой программной единицы, так и переданных
из других подпрограмм, не имеющих своего обработчика ошибок. Каждое исклю
чение имеет свое имя. Существует небольшое число предопределенных исключе
ний, таких как CONSTRAINT_ERROR (возникает, когда индекс выходит за объявленный
диапазон, когда при присваивании нарушается ограничение на диапазон значений
и т. д.). Все остальные исключения объявляются следующим образом:
èìÿ_èñêëþ÷åíèÿ: exception
Обработчик исключений начинается с имен исключительных ситуаций, кото
рые он обрабатывает, далее следует последовательность операторов, которые вы
полняют действия, необходимые для обработки исключения. Общий синтаксис
обработчиков исключений следующий:
exception
when èìÿ_èñêëþ÷åíèÿ | ... | èìÿ_èñêëþ÷åíèÿ
=> ïîñëåäîâàòåëüíîñòü_îïåðàòîðîâ;
...
when others => ïîñëåäîâàòåëüíîñòü_îïåðàòîðîâ;
где каждая последовательность операторов может обрабатывать одну или несколько
именованных исключений. Обработчик others других, не перечисленных ранее ис
ключений, не обязателен. Однако если он присутствует, он обрабатывает все ис
ключения, не перечисленные в предыдущих обработчиках.
Исключение генерируется либо неявно элементарной операцией, либо явно по
средством выполнения оператора:
raise èìÿ_èñêëþ÷åíèÿ
Когда сгенерировано исключение, управление передается обработчику исклю
чений текущей выполняемой программной единицы, если, конечно, эта программ
ная единица имеет соответствующий этому исключению обработчик. Если обра
ботчика нет, тогда исключение передается по цепочке вызовов подпрограмм первой
из них, в которой имеется соответствующий обработчик, или, в конце концов, если
нет программноопределенного обработчика, исключение передается на обработ
ку системноопределенному обработчику. Исключения не передаются из задач.
Как только исключение обработано обработчиком, подпрограмма (или другая
программная единица) нормально завершает свое выполнение и возвращает уп
равление обратно в вызвавшую ее подпрограмму. Таким образом, обработчик ис
ключений в языке Ada завершает выполнение тела подпрограммы, которое было
прервано, когда возникло исключение. Здесь не предусмотрено возобновление
выполнения программной единицы, в которой возникло исключение. Обработчик
может частично обработать исключение, а затем передать это же исключение на
зад по динамической цепочке, выполнив оператор raise без имени исключения.
Задачи. Задача — это подпрограмма, которая может выполняться параллельно
с другими задачами. Более подробно задачи были рассмотрены в разделе 11.2.
П.1. Ada