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

122 Глава 5

реализации равно хороши. Самый лучший подход — сигнализи­ровать об исключительной ситуации failure. Часто это происхо­дит естественным образом, либо из-за того, что не обрабатывается исключительная ситуация, которая не имеет места для аргумен­тов, принадлежащих допустимому подмножеству, либо из-за выхода на конец процедуры, которая должна возвращать резуль­таты. (В этом случае компилятор языка CLU вставляет команды для сигнализации об исключительной ситуации failire.) В других случаях, возможно, стоит затратить некоторые усилия. Напри­мер, в процедуре merge (рис. 3.6) мы можем во время просмотра элементов массива сравнивать эти элементы с целью определить, упорядочены они или нет, и если нет, то мы сигнализируем об исключительной ситуации failure. Такие проверки — некоторая дополнительная работа, однако они существенно улучшают устой­чивость программы.

Не все ошибки сызывают исключительные ситуации. Напри­мер, пусть в большом вводном файле имеется ошибочная запись и будет возможно продолжать обработку файла, пропустив эту запись. В этом случае целесообразно оповес_ти_гь_..иол.ьзователя (а не программу) о произошедшей^ошибке. Исключительные ситуа-ций^являются механизмом взаимодействия программ, а не про­грамм с пользователями. Для взаимодействия с пользователями па какое-нибудь устройство вывода может быть выдано сообщение об ошибке. Заметим, что реакция на ошибку определяется в спе­цификации абстракции.

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

Например, операция lookup над таблицей символов имеет две цели. Согласно заданному идентификатору, она определяет, обрабатывалось ли уже объявление этого идентификатора и если да, то возвращает информацию об этом идентификаторе. Заголовок для этой операции может быть следующим:

lookup =proc(s: symbol-table, id: string) returns (info) signals (noL in)

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

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

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

Стоит поговорить о взаимосвязи модификации аргументов с за­вершением работы процедуры выходом на исключительную ситуа­цию. Секция modifies спецификации указывает, что аргумент может модифицироваться, но не говорит о том, когда это проис­ходит. Если имеются исключительные ситуации, то обычно мо­дификации происходят только для каких-нибудь из них. Что в точности происходит, должно быть описано в секции effects. Модификации должны быть описаны явно в каждом случае, в ко­тором они совершаются; если не описано никаких модификаций, это означает, что они не совершаются вообще. Например, рас­смотрим процедуру

addel == proc (s: olist [t], x: t) sinals (dupl) modifies s

effects Если x уже принадлежит s, сигнализировать об исключ. ситуации dupl, иначе включить х в s,

Так как для случая, когда процедура addel сигнализирует об исключительной ситуации dupl, не описано никаких модификаций, s модифицируется только при обычном возврате из процедуры addel,

Исключительная ситуация failure является неявной исключи­тельной ситуацией каждой процедуры, однако она не упоми­нается ни в каких спецификациях. И это вполне оправданно. Спецификация описывает поведение процедуры при ее работе и для случая, когда аргументы удовлетворяют предложению re­quires. Исключительная ситуация failure возникает тогда, когда в работе процедуры происходит сбой и она больше не отвечает своей спецификации или когда заданы неверные аргументы. .

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

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

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