16

catch今日、私はブロックにバグを見つけました:

catch (const exception& e){
    // do something
    // throw e; <-- bug!
    throw;    // <-- right thing to do
}

基本的に、例外をe 明示的に再スローすると、新しいstd::exception再構築が行われます。実際、カスタムビルドのメッセージではなく、what()メソッドからのメッセージがデフォルトでした。std::string

説明は何ですか?throw;それはの省略形にすぎないと思いましたthrow ExceptionJustCaught;

4

2 に答える 2

16

例外オブジェクトは少し特別です。それらはメモリ内の特別な場所に構築され、それらの寿命はそれらがキャッチされたキャッチブロックによって決定されます。

と言うとthrow e;、元の例外の存続期間はcatchブロックの終わりで終了し、コピーして新しい例外をスローするeため、古典的なスライスの問題eが発生します。 -派生よりもstd::exception、オブジェクトの派生部分をスライスすることになります。

対照的に、throw;は元の例外を再アクティブ化する特別なステートメントであるため、キャッチされなくなり、その存続期間はブロックの最後で終了しなくなります。実際、一定でない参照でキャッチした場合は、例外オブジェクトを変更し続けて再スローし、状態の変化を下位のキャッチブロックに伝えることができます。ただし、再スローは新しい例外のスローとは異なることに注意してください。

于 2012-09-22T23:08:59.063 に答える
9

throw参照によって現在の例外をスローするだけです。throw ecopyは、スローする新しい例外を作成します。これはほとんど同じ方法でreturn機能します。

于 2012-09-22T22:02:02.333 に答える