Обработчики исключений
Обработчик исключения может размещаться в конце тела подпрограммы, пакета или настраиваемого модуля, в конце тела задачи или входа, а также в конце инструкции блока или инструкции принятия (accept).
Заметим, что обработчик исключения не является обязательной частью этих конструкций.
Рассмотрим следующий пример:
declare
X : Integer range 1..20; begin Put("please enter a number "); Get(X); Put("thank you"); exception when Constraint_Error => Put("that number should be between 1 and 20"); when others => Put("some other error occurred"); end; |
Здесь описаны два обработчика. В одном выполняется обработка только исключений ограничения (Constraint_Error). Второй обработчик выполняет обработку всех остальных исключений (others).
Таким образом, если пользователь вводит число в диапазоне от 1 до 20, то ошибки не происходит и появляется сообщение "thank you".
В противном случае, перед завершением выполнения появляется сообщение обработчика исключения Constraint_Error: "that number should be between 1 and 20".
В случае возникновения какого-либо другого исключения появится сообщение от второго обработчика: "some other error occurred".
Можно описать обработчик исключений так, чтобы он обрабатывал несколько указанных исключений. Для выполнения этого, исключения должны разделяться символом '|':
. . . exception
. . . when Constraint_Error | Storage_Error => . . . |
Также следует заметить, что обработчик when others всегда должен быть последним в списке обработчиков исключений.
Если мы хотим чтобы пользователь продолжал ввод чисел до тех пор пока не пропадет ошибка ограничения, мы можем переписать предыдущий пример подобным образом:
loop
declare . . . begin . . . Get(X); exit; exception when Constraint_Error => Put("that number ... end; . . . -- здесь будет продолжено выполнение -- после возникновения исключения -- и обработки его обработчиком end loop; |
Кроме того, этот пример показывает точку в которой будет продолжено выполнение инструкций после возникновения исключения и его обработки обработчиком.