С++ для начинающих



         

Обработка исключения типа класса - часть 3


   try {

      mathFunc( parm );  // возбуждает исключение divideByZero

   }

   catch ( mathExcp mExcp ) {

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

      // и генерирует объект-исключение еще раз

      throw;

   }

}

Будет ли повторно возбужденное исключение иметь тип divideByZero–тот же, что и исключение, возбужденное функцией mathFunc()? Или тип mathExcp, который указан в объявлении исключения в catch-обработчике?

Напомним, что выражение throw повторно генерирует исходный объект-исключение. Так как исходный объект имеет тип divideByZero, то повторно возбужденное исключение будет такого же типа. В catch-обработчике объект mExcp инициализируется копией подобъекта объекта типа divideByZero, который соответствует его базовому классу MathExcp. Доступ к ней осуществляется только внутри catch-обработчика, она не является исходным объектом-исключением, который повторно генерируется.

Предположим, что классы в нашей иерархии исключений имеют деструкторы:

class pushOnFull {

public:

   pushOnFull( int i ) : _value( i ) { }

   int value() { return _value; }

   ~pushOnFull();  // вновь объявленный деструктор

private:

   int _value;

};

Когда они вызываются? Чтобы ответить на этот вопрос, рассмотрим catch-обработчик:

catch ( pushOnFull eObj ) {

   cerr << "попытка поместить значение " << eObj.value()

        << " в полный стек\n";

}

Поскольку в объявлении исключения eObj объявлен как локальный для catch-обработчика объект, а в классе pushOnFull есть деструктор, то eObj уничтожается при выходе из обработчика. Когда же вызывается деструктор для объекта-исключения, созданного в момент возбуждения исключения, – при входе в catch-обработчик или при выходе из него? Однако уничтожать исключение в любой из этих точек может быть слишком рано. Можете сказать, почему? Если catch-обработчик возбуждает исключение повторно, передавая его выше по цепочке вызовов, то уничтожать объект-исключение нельзя до момента выхода из последнего catch-обработчика.




Содержание  Назад  Вперед