12
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いるのに、メイン関数でまだ発生するのはなぜですか?

4

1 に答える 1

21

制御のフローがコンストラクターのfunction-try-blockのハンドラーの最後に到達すると、キャッチされた例外が自動的に再スローされます。

派生クラスコンストラクターで基本クラスまたはメンバーの構築中にスローされる例外を抑制することはできません。これにより、構築に失敗したベースまたはメンバーを持つ構築された派生オブジェクトが発生するためです。

このGOTWは関連しています:http ://www.gotw.ca/gotw/066.htm

ISO / IEC 14882:2011 15.3 [except.handle] / 15から:

コンストラクタまたはデストラクタのfunction-try-blockのハンドラの最後に制御が到達すると、現在処理されている例外が再スローされます。[...]

于 2012-07-20T07:46:15.200 に答える