7

重複の可能性:
C# で例外をキャッチして再スローするのはなぜですか?

次のような C# コードに出くわすことがあります。

        try
        {
            // Some stuff
        }
        catch (Exception e)
        {
            throw e;
        }

例外メッセージをログに記録してから再スローするなどのことができることを理解しています。例外を再スローするだけのキャッチについて話しています。これには意味がありません。3 つの質問があります。

1)これには何か利点がありますか

2)これはコードをまったく遅くしますか

3) catch ブロックが次のような場合、違いはありますか。

        catch (Exception)
        {
            throw;
        }
4

12 に答える 12

20

これにより、まったく同じ例外が再スローされます。

    catch (Exception)
    {
        throw;
    }

これは、元のスタック トレースなしで例外を再スローします。

    catch (Exception e)
    {
        throw e;
    }

多くの場合throw;、例外をログに記録したり、例外を再スローする前に他のことを実行したりできるため、正当な理由があります。throw e;貴重なスタックトレース情報を一掃するため、正当な理由はわかりません。

于 2009-07-30T15:00:12.753 に答える
3

キャッチで他に何もしない場合はそうではありません...しかし、これは、キャッチを再スローする前に、ロギングやその他の種類の例外処理など、キャッチで他のことを行うためによく使用されます。

于 2009-07-30T15:00:02.363 に答える
1

違いを示す簡単なテストを作成しました。テストコードは次のとおりです。

try
{
    var broken = int.Parse("null");
}
catch (Exception ex1)
{
    System.Diagnostics.Trace.WriteLine(ex1.ToString());
}

try
{
    try
    {
        var broken = int.Parse("null");
    }
    catch (Exception)
    {
        throw;
    }
}
catch (Exception ex2)
{
    System.Diagnostics.Trace.WriteLine(ex2.ToString());
}

try
{
    try
    {
        var broken = int.Parse("null");
    }
    catch (Exception ex3)
    {
        throw ex3;
    }
}
catch (Exception ex4)
{
    System.Diagnostics.Trace.WriteLine(ex4.ToString());
}

これを実行すると、次の出力が得られます。

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Int32.Parse(String s)
   at QuickTests.Program.Main(String[] args) in C:\Projects\Test\QuickTests\Program.cs:line 18
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
A first chance exception of type 'System.FormatException' occurred in QuickTests.exe
System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Int32.Parse(String s)
   at QuickTests.Program.Main(String[] args) in C:\Projects\Test\QuickTests\Program.cs:line 33
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll
A first chance exception of type 'System.FormatException' occurred in QuickTests.exe
System.FormatException: Input string was not in a correct format.
   at QuickTests.Program.Main(String[] args) in C:\Projects\Test\QuickTests\Program.cs:line 49

最初の 2 つの例外は同じように機能することがわかります。だから、「投げる」。スタックを上に移動する例外に関する限り、何も変更しません。ただし、「ex3 をスローします。」報告された例外が異なり、例外のスタック トレースが変更されます。

于 2009-07-30T15:08:28.730 に答える
1

多くの場合、ロギングに適しています。また、再スローで引数を省略しても、e のスタック トレースは変更されません。

場合によっては、特定の型を通過させたい場合があります。たとえば、FooException 以外のすべての特別な処理を次に示します。

try
{
    // ...
}
catch (FooException)
{
    throw;
}
catch (Exception ex)
{
    // handle differently, like wrap with a FooException
    throw new FooException("I pitty the Foo.", ex);
}
于 2009-07-30T15:02:53.967 に答える
0

もちろん。

ほとんどの場合、例外をスローする前にログに記録し、メソッドからいくつかの変数値を記録します。

ただし、それをキャッチして投げるだけでは、それほど多くは得られません。

于 2009-07-30T15:00:21.677 に答える
0

そのように、いいえ。ただし、次のようにしたい場合があります。

catch (Exception ex)
{
     LogException(ex);
     throw;
}

ここで、LogException() は、例外をログに記録するか、アラートなどを電子メールで送信するカスタム クラスです。

于 2009-07-30T15:00:50.973 に答える