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

How can I catch an exception throw from an object initialized with curly braces?

本文关键字:对象 异常 初始化 何捕获      更新时间:2023-10-16

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

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 ?
}

正如你所看到的,当我从头文件中初始化一个带花括号的对象时,我不知道如何得到异常。

谢谢你

这个实例演示了函数级try块的技术。

A()
try {
   /* code */
} catch( exception e ) {
  throw e;
}
但是,

注意,如果上面的构造捕获到某些东西,必须抛出异常。它不一定是相同的例外。这是因为A的构造失败了(异常绕过了A的部分构造,和/或A的某些子对象的构造函数终止了),并且退出构造失败的构造函数的唯一方法是通过throw

我认为这是不可能的。实际上,这与避免调用成员变量的构造函数非常相似,并且会使AobjB成员不被构造。一个解决方案是将B的构造函数分成两步:

  1. 不做任何事情的默认构造函数
  2. 产生异常的initialize方法。你可以把大括号传递给那个方法。
  3. B在做任何事情之前检查是否正确初始化。