2011-01-06 8 views
2

Ich verstehe, dass wenn catch von Objekt-Argument von Basis-Exception-Klasse abgeleitet ist, wird nur diese Ausnahme behandeln. Aber ich verstehe nicht, warum ich eine Variable dieses Typs deklarieren muss, das "Ex" oder was auch immer. Ich weiß, dass es mit dem Ausnahmeobjekt "gefüllt" wird, aber verstehe es einfach nicht gut.Ausnahmen: catch (Exception ex) Frage

Antwort

7

Sie haben keine haben, um eine Variable anzugeben. Zum Beispiel können Sie schreiben:

try 
{ 
    ... 
} 
catch (IOException) 
{ 
    // Do something 
} 

aber Sie in der Regel die Ausnahme protokollieren wollen oder einige Maßnahmen ergreifen, die in irgendeiner Weise davon abhängt. (Protokollierung ist nach meiner Erfahrung bei weitem die am häufigsten verwendete Ausnahmevariable - oder sie wird als "innere Ausnahme" für eine neue Ausnahme verwendet.) Wie Sie dies tun, wird in der catch-Anweisung deklariert.

+0

@ Jon Skeet: Danke. Auch kann ich Typ als Argument oder Typ mit Variable verwenden, die dazu führen, dass diese Variable auf Instanz dieses Typs gesetzt wird? Ich müsste nur wissen, wie es terminologisch richtig ist>] – Loj

+0

@Loj: Es ist nicht klar, was du meinst. Es ist kein "Argument", weil Sie keine Methode aufrufen. Es ist nur ein Teil der Syntax eines catch-Blocks. Sehen Sie sich die Spezifikation für weitere Details an. –

+0

@ Jon Skeet: aber die MSDN-Spezifikation sagt: "Die Fangklausel kann ohne Argumente verwendet werden, in diesem Fall fängt es jede Art von Ausnahme und bezeichnet als die allgemeine Fangklausel. Es kann auch ein Objekt-Argument von System abgeleitet werden .Exception, in diesem Fall behandelt es eine bestimmte Ausnahme. "..Ich bin jetzt verwirrt – Loj

0

Wenn Sie keine Variable deklarieren, die die abgefangene Ausnahme enthält, wie analysieren Sie dann das ausgelöste Ausnahmeobjekt?

Wenn es Ihnen nicht egal ist, müssen Sie es nicht erklären. Aber im Allgemeinen ist es eine gute Idee, falls Sie etwas damit machen wollen.

1

Sie müssen keine Variable deklarieren. Sie können es wie dieses:

try 
{ 
    //something here... 
} 
catch (ThreadAbortException) 
{ 
    //handle only ThreadAbortException.. 
} 
0

Sie es verwenden können mehr Informationen über die Ausnahme

("Exception Message: {0}", ex.Message) or 

about inner exception, ex.InnerException; 
0

Die Variable finden Informationen über die Ausnahme selbst, was am wichtigsten Nachrichtentext enthalten.

Wenn Sie nur die Ausnahme abfangen und bereinigen und beenden möchten, benötigen Sie sie möglicherweise nicht, aber im Allgemeinen möchten Sie dem Benutzer oder einer Protokolldatei die tatsächliche Fehlermeldung anzeigen, die in der Variablen enthalten ist für dich bevölkert.

1
try { 
} 
catch(SQLException){ 
//do something not using exception info 
} 
catch(OtherException ex){ 
//do something else using exception info 
} 
catch(Exception ex){ 
//do something else 
Logger.Log(ex); 
} 
Verwandte Themen