异常被捕获两次

13
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

既然异常已经在B的构造函数中捕获,为什么它会在主函数中继续出现?

1个回答

22

当构造函数的函数try块的处理程序执行结束时,控制流会自动重新抛出已捕获的异常。

您不能压制在派生类构造函数中构造基类或成员时抛出的异常,因为这会导致构造失败的基类或成员的派生对象。

这个GOTW非常相关: http://www.gotw.ca/gotw/066.htm

来自ISO/IEC 14882:2011 15.3 [except.handle] / 15:

如果控制流到达构造函数或析构函数的函数try块的处理程序结尾,则当前处理的异常将被重新抛出。[...]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接