2010-07-21 23 views
7

Mögliche duplizieren (und nichts anderes!):
difference between throw and throw new Exception()"Wurf" in einem catchblock Mit

Ich bin ein Programmierer auf das Hinzufügen neuer Funktionen zu Legacy-Code zu arbeiten. Während des Debuggens analysiert ich diesen Catch-Block über, die eine wütende bekam „Objekt nicht auf Bezug des Objektes“ Ankündigung von Visual Studio:

catch(Exception ex) 
      { 
       SporeLog.Log("Failed to create new SavedDocumentList with Name: " + name, ex); 
       throw; 
      } 

Was es zu „werfen“ bedeutet. Ich bin vertraut mit throw new [exceptiontype]... aber was bedeutet es, nur ... throw?

Ist diese gute Praxis, oder sollte ich diesen Code ändern, um die Versuche der Entwickler nach mir zu erleichtern?

Und warum schreit Visual Studio mich an, um dies zu tun?

+0

Siehe [Unterschied zwischen throw und throw new Exception()] (http://stackoverflow.com/questions/2999298/difference-between-throw-and-throw-new-exception). Im Grunde können Sie etwas tun (z. B. in Ihrem Beispiel anmelden) und die Ausnahme weiter verbreiten lassen. Wichtig ist, dass es die Stack-Trace nicht unterbricht. –

+0

Während hilfreich, das erklärt nicht, warum Visual Studio 2008 mich dafür schreit. Ich habe meine Frage bearbeitet, um meine ursprüngliche Absicht, Fragen zu stellen, besser widerzuspiegeln und zu stimmen. –

+0

Der 'throw' verursacht * nicht die' NullReferenceException'. Wie unten in den Antworten angegeben, wirft die throw-Anweisung die Ausnahme erneut, ohne den StackTrace zurückzusetzen.Wenn ich die Nuancen Ihrer Frage verstehe, handelt es sich bei der * ursprünglichen * Ausnahme um eine NullReferenceException, die nicht * behandelt werden konnte. Der ursprüngliche Coder hat sie also protokolliert und neu gezeichnet, damit sie möglicherweise anderswo behandelt werden kann. – Toby

Antwort

12

Ja ist es eine gute Praxis .... was es tut, ist, es wirft die gleiche Ausnahme, die es gefangen hat, behalten den Stacktrace intakt.

8

Es bedeutet "werfen die gleiche Ausnahme". Mit anderen Worten, spulte die Ausnahme bis zum nächsten try/catch-Block auf.

Es ist nützlich, wenn Sie eine Ausnahme auf dieser Ebene nicht tatsächlich behandeln können, aber protokollieren möchten, dass die Ausnahme aufgetreten ist.

Leider denken viele Leute "log & rethrow" sollte auf jeder Ebene durchgeführt werden, was zu Anwendungen führt, die langsam ausgeführt werden, Protokolldateien mit jeder Ausnahme mehrfach protokolliert haben und oft die Ausnahme nicht behandeln.

3

throw; wiederholt die ursprüngliche Ausnahme. Auf diese Weise können Sie Aktionen auf der aktuellen Ebene ausführen und dann die Ausnahme auf dem Stapel weiterleiten.

Wenn die Ausnahmebedingung das Ergebnis eines Implementierungsdetails ist, ist es möglicherweise sinnvoller, eine Ausnahmekette zu verwenden, um eine domänenspezifische Ausnahme zu erzeugen, die die ursprüngliche Ausnahmebedingung umgeht, Ihre Clients vor Implementierungsdetails und einer Unmenge davon zu verbergen zu erfassende Ausnahmetypen

Wenn die Ausnahme für Ihre Kunden sinnvoll ist, ist es eine gute Übung, sie erneut zu übertragen.

3

Dies ist eine gute Übung (manchmal). Es ermöglicht Ihnen, eine Ausnahme abzufangen, sie zu protokollieren oder zu bestimmen, ob sie behandelt werden kann, und sie dann erneut auszulösen, ohne den StackTrace zu verlieren.

Ihre NullReferenceException kam von SporeLog als null.

+0

Es könnte auch der Verweis auf 'name' sein, der null ist. –

+0

@Philip, nein. Das wäre genauso wie str + "". –

+0

@Matthew - Woher weißt du ?? Es gibt keine Informationen in der Frage, was der Typ des Namens ist. Wenn name ein Referenztyp ist und nicht initialisiert wurde, erzeugt er beim Zugriff die Ausnahme. Wenn es ein Werttyp ist und nicht initialisiert wird, würde dies eine andere Ausnahme erzeugen. –

Verwandte Themen