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

6.2.1. Сигнализация об исключительных ситуациях

Процедура, написанная на языке CLU, может завершить работу по одному из некоторого количества условий. В ее заго^ ловок включены имена исключительных ситуаций и определены число и типы результатов, возвращаемых в каждом случае. На­пример, имеем заголовок

choose = proc (s: intset) returns (int) signals (empty) search = proc (a: array [int], х: int) returns (int)

signals (not_in, duplicate (int))

При «обычном» завершении работы этой процедуры она вы­ходит либо на конец своего тела программы, либо на оператор return. Для завершения работы с исключительной ситуацией «имя» процедура использует предложение signal

signal имя (выражение)

Предложение signal верно, только если имя исключительной ситуации указано в заголовке процедуры (или есть failure, что рассматривается в разд. 5.2.4). На рис. 5.2 представлена иллю­стрирующая сигнализацию реализация процедуры choose. Здесь мы предполагаем, что используется реализация intset, представ­ленная на рис. 4.5.

rep = array [inf ]

choose == proc (s: cvt) returns (int) signals (empty) if rep$size (s) •= 0 then signal empty end return (rep$bottom (s)) end choose

Рис. 5.2. Реализация процедуры choose.

5.2.2. Обработка исключительных ситуаций

При завершении работы процедуры с исключительной ситуа­цией, вызывающая программа должна иметь возможность пере­дать управление программе, которая будет обрабатывать эту исключительную ситуацию. Для этой цели в языке CLU имеется предложение except, которое имеет следующий вид:

Предложение except список программ обработки end

Список программ обработки исключительных ситуаций вклю­чает в себя некоторое подмножество (возможно, и все множество) исключительных ситуаций. Каждая программа обработки из списка содержит имена одной или нескольких исключительных ситуаций, за которыми следует список операторов тела про­граммы обработки, определяющих действия, которые должны быть совершены в случае возникновения этих исключительных

112 Глава 5

ситуаций. Разрешение иметь несколько имен исключительных ситуаций для одной и тЬй же программы обработки позволяет избежать дубликатов программ в случаях, когда несколько исключительных ситуаций обрабатываются одинаково.

Когда возникает исключительная ситуация, программа пре­кращает свое обычное выполнение и управление передается бли­жайшему предложению except с программой обработки, имеющей имя этой исключительной ситуации. Например, если вызов про­цедуры intset$choose в предложении

i: = intset$choose (s)

заканчивается с исключительной ситуацией empty, присвоение значения переменной i не делается и управление передается ближайшему предложению except с программой обработки для empty.

Имеется несколько различных форм программ обработки, использование которых связано с тем, имеют ли поименованные исключительные ситуации связанные с ними результирующие объекты и используются ли эти объекты в теле программы обра­ботки. Для обработки одной или нескольких исключительных ситуаций, с которыми не связаны объекты, мы просто перечис­ляем имена исключительных ситуаций. Например, оператор

when overflow, zero_ divide: тело

будет обрабатывать исключительные ситуации с именами overflow и zero-divide, ни одна из которых не имеет никаких связанных с ней результирующих объектов. Тело программы обработки следует за zero-divide. Например,

z :== х/у except when overflow, zero-divide : z := 0 end

Для обработки прерываний с результирующими объектами, которые используются в теле программы обработки, имена должны быть связаны с объектами. Снова дается список имен, но вслед за ним идут описания локальных переменных, являющихся именами результирующих объектов. Например,

when duplicate (j: int): тело

Область действия описаний — тело программы обработки. Все поименованные исключительные ситуации должны возвра­щать объекты указанных типов в указанном порядке. При вы­полнении программы обработки эти объекты присваиваются ло­кальным переменным и затем выполняются операторы тела. Например, если процедура search (а, х) сигнализирует об исклю­чительной ситуации duplicate, то после выполнения операторов

х := search (а, х) except when duplicate (j: int): i :== j end

Исключительные ситуации

i будет содержать индекс, соответствующий расположению х в а. Для обработки исключительных ситуаций с результирующими объектами, которые не используются в теле программы обра­ботки, вслед за списком имен ставится (*). Например,

when noLin, duplicate (*): тело.

Нет необходимости согласовывать число и типы результи­рующих объектов, связанных с исключительной ситуацией, за­данной в такой форме. Например, исключительная ситуация duplicate имеет один результирующий объект, a not-in не имеет ни одного. Используя эту форму, можно составить программу так, что при возникновении исключительной ситуации процедура будет возвращать всю возможно полезную информацию; если же вызывающей программе эта информация не требуется, она может игнорировать ее.

Если программист хочет обрабатывать все остальные исключи­тельные ситуации, не перечисляя их имен, в предложении except в качестве последней программы обработки может быть исполь­зована одна из следующих форм. Форма

others: тело

используется в случае, когда информация об именах исключи­тельных ситуаций и результирующих объектах не важна. Если желательна информация об имени исключительной ситуации, то используется форма

others (name: string): тело.

Здесь имя исключительной ситуации дается телу программы обработки как строка.

Заметим, что в программе обработки others все результаты исключительной ситуации теряются. Программа обработки others используется для стандартной чистки после различных исключи­тельных ситуаций, результаты которых не важны. Примером может служить программа, которая должна перед возвратом закрывать поток независимо от возникшей проблемы.

Предложения except могут быть вложенными. Предложение except как целое может внутри самого себя вызвать любые исклю­чительные ситуации, которые не включены в его список программ обработки, плюс любые исключительные ситуации, которые вызы­вает список программ обработки. На рис. 5.3 даны примеры исполь­зования предложения except.

Процедура index_sum пытается получить сумму индексов массива а, в котором хранятся элементы набора целых чисел s; если встречаются затруднения, процедура сигнализирует об исключи­тельной ситуации problem. На рисунке возможные сигналы пока­заны как комментарии к каждому предложению. Для того чтобы

Л4 Глава 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 :== surn + 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