ВУЗ:
Составители:
Рубрика:
24
бросить текущее исключение или выбросить новое исключение, содержащее
дополнительную информацию.
Таким образом, обработку возникшей исключительной ситуации могут
выполнять несколько обработчиков, принадлежащие разным уровням цепочки
вызовов.
Блок finally
До сих пор ничего не было сказано о важном участнике схемы обработки
исключений – блоке finally. Так как рассматриваемая схема является схемой без
возобновления, то это означает, что управление вычислением неожиданно по-
кидает try-блок. Просто так в большинстве случаев этого делать нельзя – нужно
выполнить определенную чистку. Прежде всего, удаляются все локальные объ-
екты, созданные в процессе работы блока. В языке С++ эта работа требовала
вызова деструкторов объектов. В C#, благодаря автоматической сборке мусора,
освобождением памяти можно не заниматься, достаточно освободить стек. Но в
блоке try могли быть заняты другие ресурсы – открыты файлы, захвачены неко-
торые устройства. Освобождение ресурсов, занятых try-блоком, выполняет
finally-блок. Если он присутствует, он выполняется всегда, сразу же после за-
вершения работы try-блока, как бы последний ни завершился. Блок try может
завершиться вполне нормально без всяких происшествий, и управление достиг-
нет конца блока, выполнение может быть прервано оператором throw, управле-
ние может быть передано другому блоку из-за выполнения таких операторов
как goto, return – во всех этих случаях, прежде чем управление будет передано
по предписанному назначению (в том числе, прежде чем произойдет захват ис-
ключения), предварительно будет выполнен finally-блок, который освобождает
ресурсы, занятые try-блоком, а параллельно будет происходить освобождение
стека от локальных переменных.
1.3.3. Схема Бертрана обработки исключительных ситуаций
Схема обработки исключительных ситуаций, предложенная в языке C#,
обладает одним существенным изъяном – ее можно применить некорректно.
Она позволяет, в случае возникновения исключительной ситуации, уведомить о
ее возникновении и спокойно продолжить работу, что, в конечном счете, при-
ведет к неверным результатам. Из двух зол – прервать вычисление с уведомле-
нием о невозможности продолжения работы или закончить вычисления с оши-
бочным результатом вычисления – следует выбирать первое. Некорректно при-
мененная схема C# приведет к ошибочным результатам.
Бертран Мейер [11] предложил следующую схему обработки исключи-
тельных ситуаций. В основе ее лежит подход к проектированию программной
системы на принципах «Проектирования по Контракту». Модули программной
системы, вызывающие друг друга, заключают между собой контракты. Вызы-
вающий модуль обязан обеспечить истинность предусловия, необходимого для
корректной работы вызванного модуля. Вызванный модуль обязан гарантиро-
Страницы
- « первая
- ‹ предыдущая
- …
- 22
- 23
- 24
- 25
- 26
- …
- следующая ›
- последняя »