Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
38
Добавлен:
23.03.2015
Размер:
884.22 Кб
Скачать

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.

Соседние файлы в папке POSIBNIK