Ситуации отказа


Отказы и исключения

Источники исключений

 

Исключения можно классифицировать, разделив их на категории.

Определение: исключительные ситуации

Исключения могут возникать при выполнении программы 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)).