2012-07-20 14 views
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; 
} 

出力は次のとおりです。例外は、すでにBのコンストラクタに巻き込まれたため例外が二回キャッチされ

0x32c88 exception A 
0x32c88 exception A 

は、なぜそれはまだ、main関数内で発生しますか?

答えて

21

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

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

このGOTWは、関連ある:ISO/IECからhttp://www.gotw.ca/gotw/066.htm

14882:2011 15.3 [except.handle]/15:

制御ハンドラの終わりに達した場合、現在処理例外が再スローされますのfunction-try-blockのコンストラクタまたはデストラクタ。 [...]

関連する問題