311 Stimmen

Bewährte Verfahren für das Abfangen und erneute Auslösen von .NET-Ausnahmen

Was sind die besten Praktiken, die beim Abfangen von Ausnahmen und dem erneuten Auswerfen von Ausnahmen zu berücksichtigen sind? Ich möchte sicherstellen, dass die Exception das Objekt InnerException und die Stapelverfolgung werden beibehalten. Gibt es einen Unterschied zwischen den folgenden Codeblöcken in der Art und Weise, wie sie dies handhaben?

try
{
    //some code
}
catch (Exception ex)
{
    throw ex;
}

Vs:

try
{
    //some code
}
catch
{
    throw;
}

0voto

redcalx Punkte 7867

Zu Ihrer Information: Ich habe dies gerade getestet, und der von 'throw;' gemeldete Stack-Trace ist nicht ganz korrekt. Beispiel:

    private void foo()
    {
        try
        {
            bar(3);
            bar(2);
            bar(1);
            bar(0);
        }
        catch(DivideByZeroException)
        {
            //log message and rethrow...
            throw;
        }
    }

    private void bar(int b)
    {
        int a = 1;
        int c = a/b;  // Generate divide by zero exception.
    }

Die Stapelverfolgung zeigt den Ursprung der Ausnahme korrekt an (gemeldete Zeilennummer), aber die für foo() gemeldete Zeilennummer ist die Zeile der throw; -Anweisung, so dass Sie nicht feststellen können, welcher der Aufrufe von bar() die Ausnahme verursacht hat.

0 Stimmen

Deshalb sollte man nicht versuchen, Ausnahmen einzufangen, wenn man nicht vorhat, etwas mit ihnen anzufangen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X