25

これら 2 つのコード例は同じですか? CatchCatch (Exception e)の出力は同じで、 ThrowThrow eと書いても結果は同じです。

主要:

try
{
    A();
    //B();
}
catch (Exception e)
{
    Console.WriteLine("{0} exception caught.", e);
}

コード 1:

static void A()
{
    try
    {
        int value = 1 / int.Parse("0");
    }
    catch (Exception e)
    {
        throw e;
    }
}

コード 2:

static void A()
{
    // Rethrow syntax.
    try
    {
        int value = 1 / int.Parse("0");
    }
    catch
    {
        throw;
    }
}
4

2 に答える 2

54

ここで2つの質問があると思います。


throwとはどう違いthrow e;ますか?

書く正当な理由はないと思いますcatch (Exception e) { throw e; }。これにより、元のスタック トレースが失われます。使用するthrow;と、元のスタック トレースが保持されます。これは、エラーの原因が見つけやすくなることを意味するため、良いことです。


catchとはどう違いcatch (Exception e)ますか?

どちらの例も同じで、同じように役に立ちません。例外をキャッチしてから再スローするだけです。小さな違いの 1 つは、最初の例ではコンパイラの警告が生成されることです。

変数「e」は宣言されていますが、使用されていません

実際に何か役立つことを行うコードが catch ブロックに他にある場合は、この質問をする方が理にかなっています。たとえば、例外をログに記録したい場合があります。

try
{
    int value = 1 / int.Parse("0");
}
catch (Exception e)
{
    LogException(e);
    throw;
}

キャッチされた例外を参照できるように、最初のバージョンを使用する必要があります。

catch ブロックが実際に例外を使用しない場合は、2 番目のバージョンを使用してコンパイラの警告を回避する必要があります。

于 2012-05-29T20:12:46.180 に答える
39

「未使用の変数」の警告を無視すると、実質的な違いがあるのは

catch {...}

catch(Exception ex) {...}

C# 以外のコードが非Exception例外をスローしている場合です。C++ は何でもスローできます。.NET 1.1 では、これらの異常な例外を処理するために(no )を使用する必要がありました。ただし、これには問題がありました。特に、何がスローされたかを確認できません。したがって、.NET 2.0 以降では、これはデフォルトでラップされているため、C++ がたとえば a - をスローしたとしても、サブクラスとして表示されます。これは構成設定で無効にできますが、そうしないでください。ほっといて!catch(Exception ex)stringException

throw;vsの問題throw ex;はすでに言及されており、スタックトレースに関連しています。どちらの場合でも使用できthrow、元のスタック トレースが保持されます。

于 2012-05-29T21:33:18.753 に答える