Исключения
Ада использует исключения для обработки ошибок. В отличие от многих других языков, в Аде принято говорить о возбуждении, а не о выбрасывании исключений и их обработке, а не перехвате.
Объявление исключения
Исключения в Аде - это не типы, а объекты, что может показаться вам необычным, если вы привыкли к тому, как работают исключения в Java или Python. Вот как вы объявляете исключение:
Несмотря на то, что они являются объектами, каждый объявленный объект исключения вы используете как «класс» или «семейство» исключений. Ада не требует, чтобы подпрограмма при объявлении указывала каждое исключение, которое может быть возбуждено.
Возбуждение исключения
Чтобы возбудить исключение нашего только что объявленного класса исключения, сделайте следующее:
Обработка исключения
Далее мы рассмотрим, как обрабатывать исключения, которые были возбуждены нами или библиотеками, которые мы вызываем. Изящная вещь в Аде заключается в том, что вы можете добавить обработчик исключений в любой блок операторов следующим образом:
В приведенном выше примере мы используем функцию Exception_Message
из пакета Ada.Exceptions
. Эта
функция возвращает сообщение, связанное с исключением, в виде строки.
Вам не нужно вводить новый блок только чтобы обработать исключения: вы можете добавить его в блок операторов вашей текущей подпрограммы:
Обратите внимание
Обработчики исключений имеют важное ограничение, с которым вам нужно быть осторожным: исключения, созданные в разделе описаний, не перехватываются обработчиками этого блока. Так, например, в следующем коде исключение не будет поймано.
Это также относится к блоку исключений верхнего уровня, который является частью текущей подпрограммы.
Предопределенные исключения
Ада имеет очень небольшое количество предопределенных исключений:
Constraint_Error
является основным, с которым вы можете столкнуться. Возбуждение исключения Constraint_Error происходит:Когда происходит выход за границы массива или, в общем, любое нарушение ограничений
В случае переполнения
В случае обращения по пустой ссылке
В случае деления на 0
Program_Error
тоже может встетиться, но, вероятно, реже. Возбуждение исключения возникает в более сложных ситуациях, таких как проблемы с порядком предвыполнения и некоторые случаи обнаружения ошибочного выполнения.Storage_Error
произойдет из-за проблем с памятью, таких как:Недостаточно памяти (при распределении)
Недостаточно стека
Tasking_Error
сигнализирует об ошибках, связанных с задачами, такими как любая ошибка, возникающая во время активации задачи.
Не следует повторно использовать предопределенные исключения. Если вы будете так делать, то при возбужденнии одного из них не будет ясно, связано ли оно с работой встроенной языковой операции или нет.