- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •4.9.3. Полнота
- •4.9.5. Операции egual, similar и copy
- •5. Исключительные ситуации
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •7.2. Абстракция данных
- •7.4. Генераторы
- •9.1.3. Пример
5.2.3. Предложение resignal
Иногда обработка исключительной ситуации сводится просто к сигнализации о той же самой исключительной ситуации с теми же самыми результатами. Для этого случая в языке CLU имеется предложение resignal
resignal имена
По существу это является короткой формой предложения excepts в котором каждое имя сигнализируется явно и с теми же самыми результатами. Например,
1 := search (a, x) resignal duplicate, not_ in
является короткой формой для
i :== search (a, x) except when not. in: signal not. in when duplicate^: int): signal duplicate (j) end
6.2.4. Необрабатываемые исключительные ситуации
Программы на языке CLU не обязательно должны включать в себя программы обработки для всех исключительных ситуаций. Вместо этого каждая процедура на языке CLU имеет еще одну дополнительную исключительную ситуацию, кроме тех, которые перечислены в списке предложений signals. Эта исключительная ситуация имеет имя failure и один аргумент, строку. Каждая исключительная ситуация, возникшая в вызванной процедуре
Исключительные ситуации
и не обрабатывающаяся явно в вызывающей процедуре, автоматически преобразуется в исключительную ситуацию failure. Это преобразование эквивалентно действиям, которые были бы произведены следующим включенным в тело процедуры предложением except:
except when failure (s: string): signal failure (s) others (s: string): signal failure («необрабатыв. искл. сит.: " Ц s) end
Если необрабатываемая исключительная ситуация не является failure, ее имя становится частью строкового аргумента; если необрабатываемая исключительная ситуация есть failure, ее строковый аргумент сохраняется. Таким образом, строковый аргумент содержит имя первой необрабатываемой исключительной ситуации.
Реализация процедуры choose (рис. 5.2) включает в себя необрабатываемую исключительную ситуацию. Так как мы знаем, что при выполнении оператора isturn набор s не пуст, мы не беспокоимся о возникновении исключительной ситуации bounds. В случае же, когда эта исключительная ситуация все-таки возникает, она автоматически распространяется как исключительная ситуация failure («необрабатыв. искл. сит.: boudns»). (Заметим, что исключительная ситуация boudns может возникнуть только в случае ошибки в реализации массивов.)
Оператор others предложения except рассматривает исключительную ситуацию failure иначе, чем другие исключительные ситуации. Если исключительная ситуация, попавшая в ветвь
others (s: string); тело
есть failure, то s присваивается строковый аргумент исключительной ситуации failure, а не строка «failure». Эффект в этом случае такой же, как если бы ветвь оператора others была разбита на две следующие части:
when failure (s: string): тело others (s: string): тело
Об исключительной ситуации failure также может быть сигнализировано явно; в этом случае должен быть задан строковый аргумент.
Должны обрабатываться все исключительные ситуации, кроме тех, которые не могут возникнуть. Следовательно, ситуация failure обычно означает, что произошла программная или системная ошибка. В атом случае ситуацию обычно анализирует программист. Информация в строке исключительной ситуации failure предназначена главным образом для программистов, а не для программ.
114 Глава 5
index .sum =proc (s: intset, a: array [int]) returns (int) signals (problem) sum: int := 0 while true do
x: int := intset$choose (s) % может сигнализировать о пустом наборе sum := sum-I- search (a, x) % overflow, not_in и duplicate
except when duplicate (j: int): sum := sum + j end % overflow intset$delete (s, x) end except when empty: return (sum)
others: signal problem end end index_sum
Рис. 5.3. Примеры предложений except.
закончить цикл, используется исключительная ситуация empty, которая может возникнуть при вызове choose. Исключительная ситуация duplicate, которая может возникнуть при вызове search, обрабатывается во вложенном предложении except, а исключительная ситуация not_ in — во внешнем except, в ветви others. В этой ветви обрабатывается также и overflow.