Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从用大括号初始化的对象捕获异常抛出?_C++_Exception_C++11_Constructor_Try Catch - Fatal编程技术网

C++ 如何从用大括号初始化的对象捕获异常抛出?

C++ 如何从用大括号初始化的对象捕获异常抛出?,c++,exception,c++11,constructor,try-catch,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(); p

我面临一个问题。我有这个:

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 ?
}
intmain()
{
尝试
{
A级obj;
} 
捕获()
{
...
}
}
B类
{
公众:
B(){从.cpp}抛出一个异常;
~B();
};
甲级
{
公众:
A();
~A();
私人:

B objB{}/我认为这本身是不可能的。事实上,这与
A
objB
成员非常相似,并且会使其未构造。解决方案是将
B
的构造函数分为两步:

  • 不执行任何操作的默认构造函数
  • 调用异常的
    初始化
    方法。可以将大括号传递给该方法
  • B
    在执行任何其他操作之前,请检查是否已正确初始化
  • 这演示了函数级
    try
    块的技术

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

    但是,请注意,如果上面的构造捕获了某个内容,则必须抛出一个异常。它不必是同一个异常。这是因为
    A
    的构造失败了(异常绕过了
    A
    的部分构造,和/或
    A
    的某些子对象的构造函数已终止),而退出构造失败的构造函数的唯一方法是通过
    抛出

    注意,如果您想避免这种情况,可以将
    B
    包装成与
    std::optional
    等效的格式,并将构造延迟到您控制的代码内。作为一种副作用,
    a
    可以具有
    B
    与否,这样您就可以拥有一个有效的
    a
    ,而
    B
    则失败。