Глава 22, Обработка исключительных ситуаций_______________________605

В этой иерархии самый верхний класс называется simpleExp. Класс MathExp наследуется от simpleExp и сам, в свою очередь, имеет дочерние классы integeroverflow и DivideByZero. Программа, использующая эту иерархию классов, может генерировать целый ряд совершенно определенных объектов исключительных ситуаций, таких как, например, integeroverflow (переполнение целого) и DivideByZero (деление на ноль). Когда дело доходит до их перехвата, появляется возможность выбирать: обрабатывать ли их как некие обобщенные исключительные ситуации (simpleExp), или как обобщенные математические (MathExp), или как конкретные исключительные ситуации, каковыми они в действительности и являются.

Особенности генерации исключительных ситуаций. Вы уже знаете, что исключительные ситуации передаются обработчикам с помощью ключевого слова throw, но в этой главе до сих пор не обсуждались две тонкости, связанные с этим ключевым словом. Обе они связаны с процессами, происходящими при генерации исключительных ситуаций. Первая относится к концепции развертывания стека. Вы помните, что под развертыванием стека имеется в виду вызов деструкторов объектов локального класса, которые исключительные ситуации выводят из области видимости. Эта концепция довольно проста и весьма существенна для эффективной обработки исключительных ситуаций в программах на C++. Развертывание стека, однако, не подразумевает, что объекты, созданные динамически с помощью операции new, будут автоматически уничтожены. Например, в этом случае объект MyLocaiGuy действительно будет уничтожен:

void Fund() {

LocalGuy MyLocaiGuy;

throw 1;

Однако в следующем случае объект уничтожен не будет:

void Fund() (

LocalGuy *MyLocalGuy = new LocalGuy;

throw 1;

i

! Предупреждение

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

Вторая тонкость касается того, как вы перехватываете исключительную ситуацию после ее генерации. Вспомните, что исключительная ситуация мо-