25

次の C++ コードを検討してください。

try {
  throw foo(1);
} catch (foo &err) {
  throw bar(2);
} catch (bar &err) {
  // Will throw of bar(2) be caught here?
}

ブロック内にないため、答えはノーだtryと思います。別の質問で、Javaの答えはノーですが、C++もノーであることを確認したいと思います。はい、テスト プログラムを実行できますが、コンパイラにバグがあるリモート ケースでの動作の言語定義を知りたいです。

4

3 に答える 3

27

いいえ。関連するtryブロックでスローされた例外のみが、ブロックによってキャッチされる可能性がありcatchます。

于 2011-08-06T14:19:16.170 に答える
9

いいえ、そうではありません。階層の上位にある囲んでいる catch ブロックは、それをキャッチできます。

サンプル例:

void doSomething()
{
    try 
    {
       throw foo(1);
    } 
    catch (foo &err) 
    {
       throw bar(2);
    } 
    catch (bar &err) 
    {
       // Will throw of bar(2) be caught here?
       // NO It cannot & wont 
    }
}

int main()
{
    try
    {
        doSomething();
    }
    catch(...)   
    {
         //Catches the throw from catch handler in doSomething()
    }
    return 0;
}
于 2011-08-06T14:24:20.277 に答える
2

いいえ、catch ブロックは最も近い例外を処理するため、... catch ( Exception &exc ) ... catch ( SomethingDerived &derivedExc ) を実行すると、例外は &exc ブロックで処理されます。

呼び出し元のメソッドに例外を委譲することで、目的の動作を実現できる場合があります

于 2011-08-06T14:25:48.790 に答える