2014-02-13 15 views
6

Kann mir jemand sagen, Unterschied zwischen und throw ex in Kürze? Ich habe gelesen, dass throw frühere Ausnahmen speichert, diese Zeile nicht erhalten.
Kann ich das in einem kurzen Beispiel sehen?Unterschied zwischen werfen und werfen ex in C# .net

+3

http://stackoverflow.com/questions/730250/is-there-a-difference-between -throw-and-throw-ex – Random

+0

'throw', ohne einen Parameter wird in einem' catch' Block verwendet, um eine Ausnahme erneut auszulösen, die den 'catch' verursacht hat. – Jodrell

Antwort

21

Ja - throw gibt die Ausnahme, die abgefangen wurde, erneut zurück und behält den Stack-Trace bei. throw ex löst die gleiche Ausnahme aus, aber setzt den Stack-Trace auf diese Methode zurück.

Es sei denn, Sie wollenden Stack-Trace zurückgesetzt (das heißt öffentlichen Anrufer aus den internen Abläufen Ihrer Bibliothek schützen), throw ist allgemein die bessere Wahl, da Sie sehen können, wo die Ausnahme entstanden.

Ich möchte auch erwähnen, dass ein "Pass-Through" catch-Block:

try 
{ 
    // do stuff 
} 
catch(Exception ex) 
{ 
    throw; 
} 

sinnlos. Es ist das exakt gleiche Verhalten, als ob es überhaupt keine try/catch gäbe.

+3

Es ist nicht sinnlos, wenn Sie vor dem Wurf eine Log-Anweisung setzen. So benutze ich es oft. – Evgeni

+15

@Eugene Du hast Recht, aber vor dem Wurf habe ich nichts - das wollte ich illustrieren. –

4

Throw wird ursprüngliche Ausnahme erneut auslösen;

Mit der Option "ex" wird eine neue Ausnahme erstellt, sodass sich die Stack-Verfolgung ändert. In der Regel wenig Sinn macht, in der Regel sollten Sie entweder nur werfen, oder eine neue Ausnahme erstellen und werfen, dass zB

// not a great code, demo purposes only 
try{ 
File.Read("blah"); 
} 
catch(FileNotFoundException ex){ 
throw new ConfigFileNotFoundException("Oops", ex); 
} 
+0

Ich habe dieses Muster, die "Neue Ausnahme auslösen", bei mehr als einer Gelegenheit verwendet, normalerweise nur dann, wenn ich durch vorhandenen Code in eine Ecke gemalt wurde. Wenn ich Zeit/Zugriff/Erlaubnis habe, * upstream * -Code zu ändern, werde ich versuchen, dies umzuformen. Allerdings habe ich dieses Muster gelegentlich auch im Greenfield-Code verwendet. –

Verwandte Themen