如何从使用花括号初始化的对象中捕获异常抛出?

时间:2014-03-08 15:52:32

标签: c++ exception c++11 constructor try-catch

我遇到了一个问题。我有这个:

int main()
{
    try
    {
        Class A obj;
    } 
    catch()
    {
     ...
    }
}

class B
{
    public:
        B(){throw an exception there from .cpp};
        ~B();
};

class A
{
    public:
        A();
        ~A();

     private:
        B objB{} // <=== Exception from there, how can I catch it ?
}

正如您所看到的,当我从头文件初始化带有大括号的对象时,我不知道如何获得异常。

谢谢:)

2 个答案:

答案 0 :(得分:1)

这个live example演示了函数级try块的技术。

A()
try {
   /* code */
} catch( exception e ) {
  throw e;
}
但是,请注意,如果上述构造捕获了某些内容,必须抛出异常。它不一定是同一个例外。这是因为A的构造失败了(异常绕过了A的部分构造,和/或A的某个子对象的构造函数被终止了),这是唯一的方法退出构造失败的构造函数是通过throw

答案 1 :(得分:0)

我认为这是不可能的。实际上,它与Avoid calling constructor of member variable非常相似,并且会使objB的{​​{1}}成员无法构建。解决方案是分两步拆分A的构造函数:

  1. 无效的默认构造函数
  2. 抛出异常的B方法。您可以将大括号传递给该方法。
  3. 在执行任何其他操作之前,
  4. initialize检查是否已正确初始化。