2011-12-26 10 views
4

は以下とします新しい例外オブジェクトへの例外オブジェクト参照を渡すことは安全ですか?

struct wrapper_exception { 
std::runtime_error& err; 
    wrapper_exception(std::runtime_error& _e) : err(e) {} 
}; 

try { 

throw std::runtime_error("foo"); 

} catch (std::runtime_error& err) { 

throw wrapper_exception(err); 
} 

質問:は、それが処理された後wrapper_exception内runtime_errorへの参照にアクセスするために安全ですか?

答えて

6

私はこれが未定義の動作であると言いたいと思います。

標準では、アクティブハンドラが例外を再スローする以外のを終了したとき、つまりthrow;と言って、例外オブジェクトの有効期間が終了することを繰り返します。

例外を元に戻すことはないので、元の例外オブジェクトはcatchブロックの最後に期限切れとなり、ローカル変数への参照を保持するオブジェクトを投げるのと異なります。

+0

これは私の解釈でもあります。別の方法としては、ここで説明するBoost Exceptionを使用することができます:http://www.boost.org/doc/libs/1_48_0/libs/exception/doc/tutorial_enable_error_info.html - Boostが元の例外をコピーするのを助けるOPのラッパー実装ではなく、余分な情報を追加する必要があります。 –

+0

私はこれも正しい解釈だと思います。 C++ 11では、exception_ptrとrethrowを明確に処理するいくつかの専門クラスが追加されています。しかし、これらのクラスを使用しない場合、 'throw'だけが元の例外を保持することができます。 –

関連する問題