23

try-catch ブロックを入れ子にすることはできますか? 例えば:


void f()
{
    try
    {
        //Some code 
        try
        {
             //Some code 
        }
        catch(ExceptionA a)
        {
            //Some specific exception handling
        }
        //Some code
    }
    catch(...)
    {
        //Some exception handling
    }
}//f
4

5 に答える 5

27

はい、完全に合法です。

内側のものを別のメソッドに移動して、見た目がすっきりし、メソッドが小さくなるようにするのが最善ですが

于 2009-02-16T15:01:27.550 に答える
12

すでに述べたように、それは可能ですが、これで「フォールスルー」スキームを確認する必要があります。最初のtry-catch-blockで例外がキャッチされた場合、外側のcatch-blockによってキャッチされません。ただし、内側のキャッチブロックにキャッチされない場合は、外側のキャッチブロックで一致する例外ハンドラーを見つけようとします。

throw;内部の例外ハンドラで使用することにより、例外を明示的に次の例外ハンドラに上げることもできます。

たとえば、次のコード:

try
{
    try
    {
        throw std::runtime_error("Test");
    }
    catch (std::runtime_error& e)
    {
        std::cerr << "Inner Exception-Handler: " << e.what() << std::endl;
        throw;
    }
}
catch (std::exception& e)
{
    std::cerr << "Outer Exception-Handler: " << e.what() << std::endl;
}

結果は次のようになります。

内部例外ハンドラ:テスト
外部例外ハンドラ:テスト

これが機能するのは、 std::runtime_errorがstd::exceptionから派生しているためです。このような些細な例では、catch-blockを次々に書き込むことも可能ですが、最初のcatch-blockの後に他のコードを実行する場合は、それらをネストする必要があることにも注意してください。

于 2009-02-16T15:09:06.860 に答える
7

はい、それは合法です。ousterが言ったように、それに対処する 1 つの方法は、内側の try-catch ブロックを独自の関数に入れ、外側の try-catch ブロックからその関数を呼び出すことです。

これを処理する別の方法は、複数の catch ブロックを使用することです。

void f()
{
    try
    {
        //Some code that throws ExceptionA
        //Some code that throws ExceptionB
    }
    catch(ExceptionA ea)
    {
        //Some exception handling
    }
    catch(ExceptionB eb)
    {
        //Some exception handling
    }
}//f

ここで注意すべきことは、catch ブロックの例外タイプの特異性です。上記の例で ExceptionB が ExceptionA を拡張する場合、スローされる ExceptionB はすべて ExceptionA ブロックによって処理されるため、ExceptionB ブロックは呼び出されません。例外クラスの階層を処理するときは、catch ブロックを最も具体的な順序から最も具体的でない順序に並べる必要があります。

于 2009-02-16T15:25:33.123 に答える
1

はい、できます。

于 2009-02-16T15:00:25.197 に答える
1

合法ですが、内部の catch() から例外をスローしない限り、それほど有用ではありません。たとえば、システム レベルの例外をキャッチしたいが、コードを明確にするために独自の例外オブジェクトをスローしたい場合があります。

于 2009-02-16T15:23:12.193 に答える