捕获构造函数的初始值设定项列表中的exception

这是一个好奇的。 我有一个类A.它有一个类B的项目,我想要使用一个初始化列表在A的构造函数中初始化,如下所示:

class A { public: A(const B& b): mB(b) { }; private: B mB; }; 

有没有办法来捕捉exception,可能是由mB的复制构造函数抛出,同时仍然使用初始化列表方法? 或者我必须在构造函数的大括号中初始化mB以获得try / catch?

阅读http://weseetips.wordpress.com/tag/exception-from-constructor-initializer-list/

编辑:更多挖掘后,这些被称为“function尝试块”。

我承认,直到我去看,我才知道这一点。 你每天都能学到东西! 我不知道这是否是对现在使用C ++的程度的一种控制,我缺乏C ++知识,或拜占庭式的function,使得语言枯竭。 好 – 我还是喜欢它:)

为了确保人们不必跳转到另一个站点,构造函数的一个函数try语句的语法结果是:

 C::C() try : init1(), ..., initn() { // Constructor } catch(...) { // Handle exception } 

这不是特别漂亮:

 A::A(const B& b) try : mB(b) { // constructor stuff } catch (/* exception type */) { // handle the exception } 

我知道这个讨论开始以来已经有一段时间了。 但是Adam提到的try-and-catch构造是C ++标准的一部分,并且由Microsoft VC ++和GNU C ++支持。 这是有用的程序。 顺便说一下,catch会自动生成另一个exception来指示构造函数失败。

 #include <iostream> #include <exception> #include <string> using namespace std; class my_exception: public exception { string message; public: my_exception(const char* message1) { message = message1; } virtual const char* what() const throw() { cout << message << endl; return message.c_str(); } virtual ~my_exception() throw() {}; }; class E { public: E(const char* message) { throw my_exception(message);} }; class A { E p; public: A() try :p("E failure") { cout << "A constructor" << endl; } catch (const exception& ex) { cout << "Inside A. Constructor failure: " << ex.what() << endl; } }; int main() { try { A z; } catch (const exception& ex) { cout << "In main. Constructor failure: " << ex.what() << endl; } return 0; } 

你可以使用懒惰的初始化,但是,这是持有一个unique_ptr Reader在MyClass中,并用新的创build。 这样,你甚至不需要has_reader标志,但是你可以看看你的unique_ptr是否是初始化的。

 #include <iostream> #include <memory> using namespace std; class MyOtherClass { public: MyOtherClass() { throw std::runtime_error("not working"); } }; class MyClass { public: typedef std::unique_ptr<MyOtherClass> MyOtherClassPtr; MyClass() { try { other = std::make_unique<MyOtherClass>(); } catch(...) { cout << "initialization failed." << endl; } cout << "other is initialized: " << (other ? "yes" : "no"); } private: std::unique_ptr<MyOtherClass> other; }; int main() { MyClass c; return 0; } 

当然,也有解决scheme没有使用例外,但我认为这是您的设置的先决条件。

我不明白你如何用initializer-list语法来做到这一点,但是我也有点怀疑你可以通过在构造函数中捕获exception来做任何有用的事情。 显然,这取决于类的devise,但是在什么情况下你将不能创build“mB”,而仍然有一个有用的“A”对象?

你也可以让exception渗透,并在A的构造函数被调用的地方处理。