Источники исключений
Источники исключений
Исключения можно классифицировать, разделив их на категории.
Определение: исключительные ситуации
Исключения могут возникать при выполнении программы r в результате следующих ситуаций.
1 Попытка квалифицированного вызова a.f и обнаружение, что a = Void.
2 Попытка присоединить значение Void к развернутой (expanded) цели.
3 Выполнение невозможной или запрещенной операции, обнаруживаемое аппаратно или операционной системой.
4 Вызов программы, приводящей к отказу.
5 Предусловие r не выполняется на входе.
6 Постусловие r не выполняется на выходе.
7 Инвариант класса не выполняется на входе или выходе.
8 Инвариант цикла не выполняется в результате инициализации в предложении from или после очередной итерации тела цикла.
9 Итерация тела цикла не уменьшает вариант цикла.
10 Не выполняется утверждение инструкции check.
11 Выполнение инструкции, явно включающей исключение.
Случай (1) отражает одно из основных требований к использованию ссылок: вызов a.f имеет смысл, когда к a присоединен объект, другими словами, когда a не void. Это обсуждалось в лекции 8 при рассмотрении динамической модели.
Случай (2) также имеет дело с void значениями. Напомним, что "присоединение" (attachment) покрывает присваивание и передачу аргументов, имеющих одинаковую семантику. В разделе "Гибридное присоединение" лекции 8 отмечалась возможность присваивания ссылки развернутой цели, в результате чего происходит копирование объекта. Но это предполагает существование объекта, но если источник void, то присоединение вызовет исключение.
Случай (3) следствие сигналов, посылаемых приложению операционной системой.
Случай (4) возникает при отказе программы, как результат возникновения в ней исключения, с которым она не смогла справиться. Более подробно это будет рассмотрено ниже, но пока обратите внимание на правило, вытекающее из (4):
Отказы и исключения
Отказ программы - причина появления исключения в вызывающей программе.
Случаи (5)-(10) могут встретиться только при мониторинге утверждений, включенных на соответствующем уровне: assertion (require) для (5), assertion (loop) для (8) и (9) и так далее.
Случай (11) предполагает вызов процедуры raise, выбрасывающей (зажигающей) исключения. Такая процедура будет рассмотрена чуть позднее.