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

AlgStr / Библиотека / ЛЕКЦИИ / POSIBNIK / Исключительные ситуации

.DOC
Скачиваний:
34
Добавлен:
23.03.2015
Размер:
52.22 Кб
Скачать

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

Процедуры в процессе работы преобразуют аргументы в результаты.

Аргументы принадлежат области определения.

Результаты принадлежат области изменения.

Часто процедура имеет смысл только для аргументов, принадлежащих подмножеству её области определения.

Пример:

choose = proc ( S : intset ) returns (int)

requires S - непустой набор intset

effects - возвращает какой-нибудь элемент из S

Операция choose для наборов целых чисел имеет смысл, только если её аргумент - не пустой набор. Пока мы учитываем эту ситуацию, используя процедуру, заданную на некоторой части её области определения.

Тот , кто обращается к такой процедуре, должен гарантировать, что аргументы принадлежат допустимому подмножеству области определения, и тот , кто реализует процедуру, может игнорировать аргументы, не принадлежащие этому подмножеству.

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

Такие процедуры приводят к не устойчивым программам.

Опр.: Частичная процедура - это процедура определённая не на всей области определения.

Устойчивая программа - это программа, которая ведёт себя корректно даже в случае ошибки. Программа обеспечивает хорошую дегродацию.

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

Два пути реакции на ошибки:

  1. Осуществить некоторую апроксимацию поведения программы при отсутствии

ошибки.

  1. Остановится; выдать сообщение об ошибке.

Чтобы распознавать ошибки нужно: распознать ошибочную ситуацию; разбить область D = D0 U D1 U . . . U Dn на подмножества, этим подмножествам присвоить имена.

D0 - обычный (R0) }

D1 - имя1 (R1) }

. . . . . . . . . . . . . . . . . } - исключительные ситуации

Dn - имя n (Rn) }

Пример:

choose: D0 - обычный (int)

D1 - empty ( )

Чтобы специфицировать процедуры, которые вызывают исключительные ситуации, добавим в спецификацию предложение signals.

signals % здесь приводится список имен и результатов исключительных

ситуаций.

Это предложение - часть заголовка. Оно следует за предложением returns.

choose = proc ( S : intset ) returns (int) signals (empty)

Это предложение говорит о том, что процедура choose может вызывать исключительную ситуацию empty и что в этом случае не возвращается никакого результата.

search = proc ( a : array [int}, x : int ) returns ( ind : int )

signals ( not_in, duplicete ( indl : int )

Это предложение говорит о том, что процедура search может вызвать две исключительные ситуации: not_in (без результата) и duplicete (результат целое число). Имя indl вводится для ссылок на этот результат в остальной части спецификации.

Как и раньше, секция effects должна определять поведение процедуры для всех фактических аргументов, отвечающих предложению requires. Так как это поведение включает в себя исключительные ситуации, секция effects должна определять, что приводит к вызову каждой исключительной ситуации и что делает процедура в каждом таком случае. Если процедура сигнализирует об исключительной ситуации для аргументов, принадлежащих Di, возможные значения аргументов, принадлежащие Di, не должны присутствовать в предложении requires. Завершение процедуры оповещением об исключительной ситуации - это один из нормальных режимов работы этой процедуры.

Спецификация процедур choose и search.

choose = proc ( S : intset ) returns (int) signals (empty)

signals empty

effects ЕСЛИ S - непустой набор

ТО возвращает какой-нибудь элемент из S

ИНАЧЕ сигнализирует empty

ВСЁ (если)

search = proc ( a : array [int}, x : int )

returns ( ind : int )

signals ( not_in, duplicete ( ind1 : int )

effects ЕСЛИ входит 1 раз

ТО надо написать спецификацию

ИНАЧЕ . . . . . . . и т.д.

D0 - обычный = { < a,x > | x пренадл. a ровно 1 раз }

D1 = { < a,x > | x непрен. a } - not_in

D2 = { < a,x > | x пренадл. a более чем 1 раз } - duplrcate

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

Механизм исключительных ситуаций

в языке CLU.

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

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

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

rep = array [int]

choose = proc ( S : cvt ) returns (int)

signal (empty)

if rep $ size (S) = 0 then

signal empty end

return ( rep $ bottom (S) )

end choose

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

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

except список программ обработки ситуаций end.

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

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

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

Пример:

1. Z := x/y

except when

overflow, zerodivicle

Z := 0;

end;

  1. i := search ( a,x )

exept when duplicate ( j : int )

i := j

end

when not_in : end;

Вложенные исключения.

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

Пример:

indexc_sum = proc ( S : intset; a : array [int] );

returns (int)

signels (problem)

sum : int := 0;

while true do

x : int := intset $ choose (S)

( empty } в choose )

sum := sum + search ( a,x )

( overflow } в sum) ( not_in duplicate } в search )

except when duplicate ( j : int );

sum := sum + j

end;

intset $ delete ( S,x )

end {while}

exept when empty : return (sum)

others : signal problem;

end

end index_sum

Необрабатываемая исключительная ситуация.

failure ( S :string ) - имя возникшей ситуации.

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

Об исключительной ситуации failure может быть сигнализировано явно; в этом случае должен быть задан строковый аргумент.

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

Пример:

Turbo Pascal

{ $ I- }

if IoResult < > 0 then . . . .

VBA

Sub имя_sub ( < . . . >)

On ERROR GOTO имя_sub_err

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

Exit_имя_sub :

Exit_Sub

имя_sub_err :

Textbox Err.Num - номер ошибки

Textbox Err.Description - сообщение (стандартное) об ошибке

Resume

Exit_имя_sub

end Sub

C++

int f ( int arg )

{ try { g (arg)

}

catch (X1) - обработка исключительной ситуации

terminate ( ) - завершать программу

}

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

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

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

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

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

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

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

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

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