Список инициализатора конструктора C ++ генерирует исключения

У меня проблема со следующим кодом. Как мы видим, я уже обработал исключение, сгенерированное конструктором A в конструкторе C, зачем мне снова пытаться перехватить и обработать исключение в основной функции?

#include <iostream>

class WException : public std::exception
{
public:
WException( const char* info ) : std::exception(info){}
};

class A
{
public:
A( int a ) : a(a)
{
std::cout << "A's constructor run." << std::endl;
throw WException("A constructor throw exception.");
}

private:
int a;
};

class B
{
public:
B( int b ) : b(b)
{
std::cout << "B's constructor body run." << std::endl;
throw WException("B constructor throw exception");
}

private:
int b;
};

class C : public A, public B
{
public:
C( int a, int b ) try : A(a), B(b)
{
std::cout << "C's constructor run." << std::endl;
}
catch( const WException& e )
{
std::cerr << "In C's constructor" << e.what() << std::endl;
}
};

int main( int argc, char* argv[] )
{
try
{
C c( 10, 100 );
}
catch( const WException& e )
{
std::cerr << "In the main: " << e.what() << std::endl;
}

return 0;
}

7

Решение

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

Если строительство a броски, часть c не был инициализирован и полностью отсутствует — время жизни a никогда не начинается a не является дополнительной частью Cиначе это должен быть указатель или std::optional (начиная с C ++ 14 — boost::optional до этого).

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

Если вы не выбросите исключение в C::CБлок catch, компилятор сделает это за вас.

Стандарт C ++, §15.3,15:

Обрабатываемое в настоящий момент исключение перебрасывается, если управление достигает конца обработчика функции-try-block конструктора или деструктора.

Для более широкого рассмотрения этой темы см. http://www.gotw.ca/gotw/066.htm

16

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]