- •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
110 Глава 5
На рис. 5.1 показаны спецификации процедур choose и search.
choose = proc (s: intset) returns (int) signals (empty)
effects Если size (s) = 0, то сигнализировать об исключительной ситуации empty, иначе возвратить произвольный элемент s.
search = proc (a: array [int], х: int) returns (ind: int) signals (notJn, duplicate (iridi: int))
requires Массив а упорядочен в возрастающем порядке. effects Если х ^ а один раз, то возвратить ind, такой, что a find] == х; Если х ^ а более чем один раз, то сигнализировать об исключительной ситуации duplicate (indi), где indi —индекс для одного из х; иначе— сигнализировать об исключительной ситуации not_in.
Рис. 5.1. Спецификации с исключительными ситуациями.
Заметим, что спецификация процедуры search содержит предложение requires и что, как обычно, в секции effects предполагается, что все требования предложения requires удовлетворены. Область определения процедуры search есть
Do = {(а, х> di = {(а, х D» = {(а, х<)
х ^ а ровно один раз) х^а) х $ а более чем один раз}
Здесь подмножества области определения стоящие из массива и целого числа.
это пары, со-
5.2. Механизм исключительных ситуаций в языке CLU
Язык программирования может сделать работу о исключительными ситуациями легкой, если он включает в себя механизм исключительных ситуаций. Этот механизм должен обеспечивать для процедуры возможность сигнализировать об исключительных ситуациях, т. е. доводить их возникновение до сведения использующего процедуру. Кроме того, эту информацию должна быть способна получать вызывающая процедура, чтобы обрабатывать исключительные ситуации. Однако вызывающая процедура не должна обрабатывать исключительные ситуации, которые не могут возникнуть. Например, предположим, что мы выполняем следующую операцию:
И intset$size (s) £> 0 then х := intset$choose (s) end
Будет странно, если обращение к процедуре choose сигнализирует нам об исключительной ситуации empty. Для программиста нет необходимости обрабатывать исключительные ситуации в подобных случаях.
Исключительные ситуации
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.
