суббота, 16 апреля 2011 г.

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

Очередное откровенное знание о C++ спешу изложить :)
Короткий ответ на вопрос в сабже, очевидно: ДА.
Теперь на секунду задумайтесь, как это возможно...
Подумали? Я лично ничего придумать не смог. Но все гениальное, как известно, просто:

class C : private A {
private:
 B b;
public:
 C::C()
 try
  : A (...),
   b(...)
 {
 }
 catch(...) {
  ...
 }
};

А теперь задумайтесь: стоит ли вообще перехватывать подобные исключения и если перехватили, что с ними делать?
Для этого сначала полезно ответить на вопросы:
  • Что такое время жизни объекта?
  • Можно ли считать объект "живым" внутри конструктора/деструктора?
  • Можно ли считать, что объект хоть сколько-то просуществовал, если в конструкторе было сгенерировано исключение?
Источник: Герб Саттер "Решение сложных задач на C++" (Задачи 2.13-2.15)

Комментариев нет:

Отправить комментарий