Когда нет предложения rescue
Формализовав роль предложения rescue, вернемся к рассмотрению ситуации, когда это предложение отсутствует в программе. Правило для этого случая было введено ранее, но с обязательством его уточнения. Ранее полагалось, что отсутствующее предложение rescue эквивалентно присутствию пустого предложения (rescue end). В свете наших формальных правил это не всегда является приемлемым решением. Правило (3) требует:
{True} Rescuer {INV}
Если
Зададим точное правило. Класс
default_rescue is
-- Обрабатывает исключение, если нет предложения rescue.
-- (По умолчанию: ничего не делает)
do
end
Программа, не имеющая предложения rescue, рассматривается теперь как эквивалентная программе с предложением
rescue
default_rescue
Каждый класс может переопределить
Вы, конечно, помните, что одна из ролей процедуры создания состоит в производстве состояния, удовлетворяющего инварианту класса
Продвинутая обработка исключений
Чрезвычайно простой механизм, разработанный до сих пор, удовлетворяет большинству потребностей обработки исключений. Но некоторые приложения могут требовать более тонкой настройки:
[x]. Возможно, требуется определить природу последнего исключения, чтобы разными исключениями управлять по-разному.
[x]. Возможно, требуется запретить включение исключений для некоторых сигналов.
[x]. Возможно, вы захотите включать собственные исключения.
Можно было бы соответствующим образом расширить механизм, встроенный в язык, но это не кажется правильным подходом. Вот, по меньшей мере, три причины. Первая - свойства нужны только от случая к случаю, так что они будут загромождать язык. Вторая - все, что касается сигналов, может зависеть от платформы, а язык должен быть переносимым. Наконец, третья, - когда выбирается множество подобных свойств, никогда нет полной уверенности, что позже вам не захочется добавить новое свойство, что требовало бы модификации языка - не очень приятная перспектива.
В таких ситуациях следует обращаться не к языку, но к поддерживающим библиотекам. Мы введем библиотечный класс
Запросы при работе с классом EXCEPTIONS
Класс
exception: INTEGER
-- Код последнего встретившегося исключения
original_exception: INTEGER
-- Код последнего исключения - первопричины текущего исключения
Разница между
Коды исключений являются целыми. Значения для предопределенных исключений задаются целочисленными константами, обеспечиваемыми классом
Check_instruction: INTEGER is 7
-- Код исключения при нарушении утверждения check
Class_invariant: INTEGER is ...
-- Код исключения при нарушении инварианта класса
Incorrect_inspect_value: INTEGER is ...
