Ситуации отказа
Отказы и исключения
Источники исключений
Исключения можно классифицировать, разделив их на категории.
Определение: исключительные ситуации
Исключения могут возникать при выполнении программы 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 , выбрасывающей (зажигающей) исключения. Такая процедура будет рассмотрена чуть позднее.
Рассматривая список возможных исключений, полезно определить, когда может встретиться отказ (причина исключения у вызывающей программы):
Определение: случаи отказа
Вызов программы приводит к отказу, если и только если встретилось исключение в процессе выполнения, и программа не смогла с ним справиться.
Определения отказа и исключения взаимно рекурсивны: отказ возникает из-за появления исключений, а одна из причин исключения - отказ при вызове программы (случай (4)).