Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oop-VisualWorks.pdf
Скачиваний:
28
Добавлен:
13.02.2015
Размер:
1.23 Mб
Скачать

138 Глава 8. Исключения и их обработка

[^ x/y]

on: ZeroDivivde do: [:exception|

exception retryUsing: [^ x=0

ifTrue: [#indeterminancy] ifFalse: [#infinity]]]

Сообщение retryUsing:, когда повторяет процесс выполнения, также урезает среду исключения до среды исключения активного обработчика.

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

[n/m]

on: ZeroDivide do: [:exception|

"0/0 = 1; иначе raiseSignal для исключения ZeroDivide." exception dividend = 0

ifTrue: [exception pass] ifFalse: [exception return: 1]

В этом примере случай 0/0 обрабатывается особо. Если делимое — нечто, отличное от нуля, то управление переходит к исключению ZeroDivide. Управление никогда не возвращается отправителю сообщения pass.

8.7. Преобразование исключений

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

Здесь нужна осторожность, чтобы случайно не выполнить не тот обработчик. Дело в том, что среда исключений в пределах обработчика, поднятого исключением низкого уровня, не обязательно такая же, как среда исключений, поднятая исключением высокого уровня. Эта проблема решается использованием в блоке обработки сообщения resignalAs: вместо сообщения raiseSignal. Например:

[low-level I/O]

on: OperatingSystemException do: [:ex |

8.8. Развертывание защиты

139

ex errorCode = -213

ifTrue: [ex resignalAs: EndOfFile new] ifFalse: [ex resignalAs:

[Error new messageText: ’OS Error’]]

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

8.8. Развертывание защиты

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

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

Чтобы выполнить блок зачистки, независимо от характера (нормального или аварийного) выхода из защищённого блока, используется сообщение ensure:.

ifCurtailed: terminationBlock

Выполнить блок-получатель( защищаемый блок) и возвратить его результат. Если происходит аварийное завершение защищаемого блока, выполнить блок зачистки terminationBlock, но от возвращаемого им значения отказаться.

ensure: terminationBlock

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

140

Глава 8. Исключения и их обработка

8.9.Контрольные вопросы

1)Что такое исключение или особая ситуация?

2)Экземплярами каких классов представляются исключения?

3)Что такое метод обработки (обработчик) исключения?

4)К чему приводит обработка по умолчанию большинства исключений?

5)Через какое сообщение определяется обработчик исключения?

6)Что такое блок обработки и защищенный блок?

7)Как при обработке исключений используется иерархия классов исключений?

8)Как установить обработчик исключений так, чтобы он обрабатывал несколько исключений, не обязательно входящих в одну ветвь иерархии?

9)Как создается (поднимается, вызывается) исключение в коде?

10)Что такое среда исключений процесса? Как она формируется и изменяется?

11)Что такое возобновляемые и невозобновляемые исключения?

12)Как проверить, является исключение возобновляемым или нет?

13)Какие команды испоьзуются для явного выхода из обработчика, и каковы их особенности?

14)Как в приложении выполнить некоторые обязятельные действия, независимо от того, возникает исключение или нет? Какой класс обеспечивает такую возможность? Что такое блок зачистки?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]