2010-04-28 7 views
50

Mögliche Duplizieren:
difference between throw and throw new Exception()Was "wirft" an sich selbst tun?

Was wäre der Punkt, der nur

mit
catch (Exception) 
{ 
    throw; 
} 

Was macht das?

+0

möglich Duplikat von [Unterschied zwischen werfen und werfen neue Exception()] (http://stackoverflow.com/q/2999298/) und [der Unterschied zwischen versuchen/fangen/werfen und versuchen/fangen (e)/werfen e] (http://stackoverflow.com/q/1697216/). –

Antwort

80

An sich löst das Schlüsselwort throw einfach die Ausnahme wieder auf, die durch die obige catch-Anweisung aufgefangen wurde. Dies ist praktisch, wenn Sie eine rudimentäre Ausnahmebehandlung durchführen möchten (möglicherweise eine kompensierende Aktion wie das Zurücksetzen einer Transaktion) und dann die Ausnahme erneut an die aufrufende Methode übergeben.

Diese Methode hat einen wesentlichen Vorteil gegenüber dem Einfangen der Ausnahme in einer Variablen und dem Werfen dieser Instanz: Sie behält den ursprünglichen Aufruf-Stack bei. Wenn Sie fangen (Exception ex) und dann ex werfen, beginnt Ihr Call-Stack nur bei dieser throw-Anweisung und Sie verlieren die Methode/Zeile des ursprünglichen Fehlers.

+0

Wie ich die Frage verstehe, ist der gesamte Inhalt des 'catch' Blocks' throw; ', also keine zusätzliche Ausnahmebehandlung. Ich könnte mich jedoch irren. – Gorpik

+0

Was ist deine Antwort auf Boris 'Punkt? – CJ7

+0

Boris ist richtig, dass das Beispiel nicht wirklich etwas bewirkt, aber ich glaube nicht, dass es irgendeine Änderung am Call-Stack gibt. –

3

Es wiederholt genau den gleichen Fehler, Sie erhalten nichts davon.
Manchmal können Sie die Fangmethode verwenden einige Protokollierung oder etwas ohne interupting Ihre Ausnahme wie dies zu tun:

catch (Exception) { 
    myLogger.Log(LogLevels.Exception, "oh noes!") 
    throw; 
} 

ich zunächst mistakingly dachte, dies wäre Ihr Stapel entspannen, aber das wäre nur, wenn Sie Folgendes tun würde :

catch (Exception err) { 
    throw err; 
} 
+0

Sind Sie sicher, dass Sie den Extra-Stack-Abbau haben, da die Verwendung von "throw" allein die ursprüngliche Ausnahme mit dem exakten Stacktrace als Original erneut auslöst ... oder? – veggerby

+0

@boris: Willst du sagen, dass Code zweimal ausgeführt wird? – CJ7

+0

@Veggerby: Du hast Recht, ich war verwirrend mit dem Fall, wo du sagst (Ausnahme ex) {ex}. Im Falle des Codes der Frage passiert nichts wirklich. @Craig: Nein nichts wird zweimal ausgeführt –

3

Ich kann nur daran denken, wenn Sie während des Debuggens einen Haltepunkt setzen möchten.
Es ist auch der Standardcode, der von einigen Tools erzeugt wird, denke ich.

11

Manchmal mögen Sie vielleicht so etwas wie dies tun:

try 
{ 
    // do some stuff that could cause SomeCustomException to happen, as 
    // well as other exceptions 
} 
catch (SomeCustomException) 
{ 
    // this is here so we don't double wrap the exception, since 
    // we know the exception is already SomeCustomException 
    throw; 
} 
catch (Exception e) 
{ 
    // we got some other exception, but we want all exceptions 
    // thrown from this method to be SomeCustomException, so we wrap 
    // it 
    throw new SomeCustomException("An error occurred saving the widget", e); 
} 
+2

+1, weil der neue Wurf die ursprüngliche Ausnahme passiert - sehr, sehr wichtig (-: – Murph

2

einfach die aktuelle Ausnahme erneut auslösen, und diese Ausnahme wird seine „Quelle“ halten und den Stack-Trace.