C++ 异常被捕获两次

C++ 异常被捕获两次,c++,exception,constructor,C++,Exception,Constructor,由于异常已在B的构造函数中捕获,为什么它仍在主函数中发生?当控制流到达构造函数的函数try块的处理程序末尾时,捕获的异常将自动重新抛出 无法抑制在派生类构造函数中构造基类或成员期间引发的异常,因为这将导致构造的派生对象的基类或成员构造失败 本GOTW与以下内容相关: 根据ISO/IEC 14882:2011第15.3节[手柄除外]/15: 如果控件到达构造函数或析构函数的函数try块的处理程序末尾,则当前处理的异常将被重试。[……] class A{ public: A(

由于异常已在
B
的构造函数中捕获,为什么它仍在主函数中发生?

当控制流到达构造函数的函数try块的处理程序末尾时,捕获的异常将自动重新抛出

无法抑制在派生类构造函数中构造基类或成员期间引发的异常,因为这将导致构造的派生对象的基类或成员构造失败

本GOTW与以下内容相关:

根据ISO/IEC 14882:2011第15.3节[手柄除外]/15:

如果控件到达构造函数或析构函数的函数try块的处理程序末尾,则当前处理的异常将被重试。[……]

class A{
    public:
        A() { throw string("exception A"); };
};

class B{
    A a;
    public:
        B() try : a() {} catch(string& s) { cout << &s << " " << s << endl; };
};

int main(){    
    try{
        B b;
    }catch(string& s){
        cout << &s << " " << s << endl;
    }
    return 0;
}
0x32c88 exception A
0x32c88 exception A