11.3.3. Повторное возбуждение исключения

11.3.3. Повторное возбуждение исключения

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

throw;

которая вновь генерирует объект-исключение. Повторное возбуждение возможно только внутри составной инструкции, являющейся частью catch-обработчика:

catch ( exception eObj ) {

if ( canHandle( eObj ) )

// обработать исключение

return;

else

// повторно возбудить исключение, чтобы его перехватил другой

// catch-обработчик

throw;

}

При повторном возбуждении новый объект-исключение не создается. Это имеет значение, если catch-обработчик модифицирует объект, прежде чем возбудить исключение повторно. В следующем фрагменте исходный объект-исключение не изменяется. Почему?

enum EHstate { noErr, zeroOp, negativeOp, severeError };

void calculate( int op ) {

try {

// исключение, возбужденное mathFunc(), имеет значение zeroOp

mathFunc( op );

}

catch ( EHstate eObj ) {

// что-то исправить

// пытаемся модифицировать объект-исключение

eObj = severeErr;

// предполагалось, что повторно возбужденное исключение будет

// иметь значение severeErr

throw;

}

}

Так как eObj не является ссылкой, то catch-обработчик получает копию объекта-исключения, так что любые модификации eObj относятся к локальной копии и не отражаются на исходном объекте-исключении, передаваемом при повторном возбуждении. Таким образом, переданный далее объект по-прежнему имеет тип zeroOp.

Чтобы модифицировать исходный объект-исключение, в объявлении исключения внутри catch-обработчика должна фигурировать ссылка:

catch ( EHstate &eObj ) {

// модифицируем объект-исключение

eObj = severeErr;

// повторно возбужденное исключение имеет значение severeErr

throw;

}

Теперь eObj ссылается на объект-исключение, созданный выражением throw, так что все изменения относятся непосредственно к исходному объекту. Поэтому при повторном возбуждении исключения далее передается модифицированный объект.

Таким образом, другая причина для объявления ссылки в catch-обработчике заключается в том, что сделанные внутри обработчика модификации объекта-исключения в таком случае будут видны при повторном возбуждении исключения. (Третья причина будет рассмотрена в разделе 19.2, где мы расскажем, как catch-обработчик вызывает виртуальные функции класса.)

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

7.4. Повторное использование

Из книги Объектно-ориентированный анализ и проектирование с примерами приложений на С++ автора Буч Гради

7.4. Повторное использование Элементы повторного использования Любой программный продукт (текст программы, архитектура, сценарий или документация) может быть использован повторно. Как сказано в главе 3, в объектно-ориентированных языках программирования первичным


Повторное использование (Reusability)

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Повторное использование (Reusability) Определение: повторное использованиеПовторное использование есть способность элементов ПО служить для построения многих различных приложений. Необходимость и возможность повторного использования возникает из наблюдений сходства


Повторное использование персонала

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

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


Повторное использование проектов и спецификаций

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

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


Повторное использование исходного текста

Из книги C++ для начинающих автора Липпман Стенли

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


Повторное использование абстрактных модулей

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Повторное использование абстрактных модулей Все предыдущие подходы, несмотря на их ограниченную применимость, осветили важные аспекты проблемы повторного использования:[x]. Повторное использование персонала необходимо, но недостаточно. Наилучшие повторно


Динамическое создание и повторное связывание

Из книги автора

Динамическое создание и повторное связывание Что не было показано при описании структуры объектов периода выполнения, так это в высшей степени динамичная природа настоящей ОО-модели. Статическая и ориентированная на стеки политика управления объектами характерна для


Повторное объявление функции как атрибута

Из книги автора

Повторное объявление функции как атрибута Повторные объявления позволяют активно применять один из центральных принципов модульности - принцип Унифицированного Доступа (Uniform Access).Напомним (см. лекцию 3), что этот принцип утверждает (первоначально в менее технических


Повторное объявление функции как атрибута

Из книги автора

Повторное объявление функции как атрибута Правило Утверждения Переобъявления нуждается в небольшом дополнении ввиду возможности при повторном объявлении задать функцию как атрибут. Что произойдет с предусловием функции и ее постусловием, если таковые имелись?Атрибут


Типизация и повторное объявление

Из книги автора

Типизация и повторное объявление Повторное объявление компонентов не требует сохранения сигнатуры. Пока оно виделось нам как замена одного алгоритма другим или - для отложенного компонента - запись алгоритма, соответствующего ранее заданной спецификации.Но, воплощая


Интерфейс и повторное использование реализаций

Из книги автора

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


3.6. Повторное использование идентификаторов

Из книги автора

3.6. Повторное использование идентификаторов Структура ipc_perm (раздел 3.3) содержит переменную seq, в которой хранится порядковый номер канала. Эта переменная представляет собой счетчик, заводимый ядром для каждого объекта IPC в системе. При удалении объекта IPC номер канала


12.5. Повторное открытие журнальных файлов

Из книги автора

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


11.1. Возбуждение исключения

Из книги автора

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


19.2.2. Возбуждение исключения типа класса

Из книги автора

19.2.2. Возбуждение исключения типа класса Теперь, познакомившись с классами, посмотрим, что происходит, когда функция-член push() нашего iStack возбуждает исключение:void iStack::push( int value ){if ( full() )// value сохраняется в объекте-исключенииthrow pushOnFull( value );// ...}* Выполнение инструкции throw


11.18. Функции, допускающие повторное вхождение

Из книги автора

11.18. Функции, допускающие повторное вхождение Функция gethostbyname из раздела 11.3 имеет интересную особенность, которую мы еще не рассматривали: она не допускает повторное вхождение (nonreentrant). Мы еще столкнемся с этой проблемой в главе 23, когда будем обсуждать потоки, но не менее