606 __ _____________Часть IV. Новые возможности C++

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

Когда ваша программа генерирует исключительную ситуацию по значению или по ссылке, Borland C++ создает копию генерируемого экземпляра объекта. Эта копия хранится во временной переменной, существование которой скрыто от вашей программы. Когда вы генерируете объект, объявленный как локальный, то к моменту вызова обработчика объект выходит из области видимости и прекращает свое существование. Обработчик получает в качестве аргумента исключительной ситуации эту таинственную "скрытую" ко-, пию, а не экземпляр, который был генерирован первоначально.

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

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

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

Еще один прием, который вы можете применить — это генерировать временный объект:

void Fund() (

throw MyClass();

}

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

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