10

「C++ プログラミング言語第 4 版」の本を読んでいて、例外処理に関する段落について質問があります。

それほど巧妙でないエラー処理手法のために、例外処理を放棄しなければならない場合があります。指針となる原則は次のとおりです。

  • 例外処理中に例外をスローしないでください。
  • キャッチできない例外をスローしないでください。

例外処理の実装がいずれかの実行を検出すると、プログラムが終了します。

誰かが最初の状況の例を教えてもらえますか? このようなものだけが頭に浮かびますが、g++ によると有効なコードです。

try
{
    throw 1;
}
catch(...)
{
    try
    {
        throw 2;
    }
    catch(...)
    {
        cout << "OK";
    }
}
4

1 に答える 1

16

これは少し誤解を招きます。それをキャッチする別のハンドラーがある限り、例外ハンドラーからスローしても問題ありません (これは、「例外を処理している間」で理解できることです)。

問題は、スタックの巻き戻し中に破棄されるオブジェクトのデストラクタから例外をスローした場合です。その場合、未処理の例外が 2 つあり、通常の例外メカニズムで処理できるのは 1 つだけです。したがって、応答は を呼び出すことterminateです。

例:

struct dodgy {~dodgy() {throw "Don't do this!";}};

try {
    dodgy d;
    throw 1;
} catch (...) {
    // Never reached: destroying `d` killed the program.
}
于 2013-07-24T15:49:26.200 に答える