- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
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.
