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

116 Глава 5

6.2.5. Предложение exit

В гл. 2 мы ввели предложения break и continue; break исполь­зуется для выхода из цикла, a continue — для перехода к следую­щей итерации цикла. Иногда необходима более общая передача управления. Эту возможность предоставляют предложения exit и except, используемые совместно.

Форма предложения exit похожа на форму предложения signal exit имя (выражение)

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

В следующем примере предложение exit используется для завершения цикла поиска.

ai == array [int] х: int i: int :== ai$low (a) begin while i <= ai$high (a) do x:=a[i]

if special (х) then exit found end i := i + I end

x :== make. new-one () % если не находит, создает новый end except when found: end % Здесь мы имеем нужное значение для х

5.3. Использование исключительных ситуаций в программах

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

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

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

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

Другой способ заключается в том, что вызывающая процедура маскирует исключительную ситуацию, т. е. обрабатывает исклю­чительную ситуацию сама. Например, процедура может считы­вать все символы потока, используя операцию stream$getc. Когда процедура getc сигнализирует о конце файла (end-ol'-file), это просто означает, что все символы считаны и пора закончить работу.

В этом разделе представлены примеры использования исклю­чительных ситуаций при спецификации и реализации процедур. Наш первый пример — наборы целых чисел intset. Эти наборы — те же, что и раньше (рис. 5.4), за исключением того, что операция intset == cluster is create, insert, delete, member, size, choose rep -= array [int] create = proc ( ) returns (cvt) return (rep$new ( )) end create

insert == proc (s: intset, х: int) if— member (s, х) then rep$addh (down (s), х) end end insert delete == proc (s: cvt, х: int)

j: int := getind (s, х) ехсерт when not_in: return end s [j] := rep$top (s) rep$remh (s) end delete

member == proc (s: cvt, х: int) returns (bool) getir)j (s, х) except when not_in: return (false) end return (true) end member size = proc (s: cvt) returns (int) return (rep$size (s)) end size

choose = proc (s: cvt) returns (int) signals (empty) return (rep$bottom s))

except when bounds: signal empty end end choose

getind == proc (s: rep, х: int) returns (int) signals (not_in) i: int := rep$low (s) while true do if x == s [i] then return (i) end

except when bounds: signal not_in end i:=i+ I end end getind end intset Рис. 5.4. Реализация типа данных intset.

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