2015-09-15 20 views
5
static void Main(string[] args) 
{ 
    try 
    { 
     Console.WriteLine("No Error"); 
    } 
    catch (DataException) /*why no compilation error in this line?*/ 
    { 
     Console.WriteLine("Error...."); 
    } 
    Console.ReadKey(); 
} 

Der Code wird ohne Fehler kompiliert. Ich verstehe nicht, warum die erste Zeile des catch-Block keine Kompilierung Fehler geben -C# catch (DataException) - keine Variable definiert

catch (Dataexception)

Dataexception Parameter der catch-Block eine Klasse, und es sollte eine Variable nächste es wie -

catch (Dataexception d)

Kann jemand das obige Verhalten erklären?

+1

Dies ist gültige Syntax für, wenn Sie nur kümmern, welche Art von Ausnahme aufgetreten ist, aber keine Stack-Trace, etc. – Blorgbeard

+0

benötigen, wenn Sie nicht das "d" benötigen – Eric

Antwort

5

In Abschnitt 8.10 der C# 5.0 spec, werden Sie die Syntaxdefinition für try/catch (Entschuldigung für die Formatierung) finden:

catch-Klauseln:
        spezifische-catch-Klauseln               allgemein -catch-clause opt         spezifische-catch-klauseln opt     allgemeine-catch-Klausel
spezifische-catch-Klauseln:
        spezifische-catch-Klausel
        spezifische-catch-Klauseln         spezifische-catch-Klausel
Spezifischer-Fang-Klausel:
        catch         (         Klasse-Typ         Kennung opt         )         Block
allgemeine-catch-Klausel:
        catch   Block

So können Sie sehen, dass catch { }, catch (Exception) { } und catch (Exception ex) { } alle gültig sind gemäß der Spezifikation.

Wenn Sie den optionalen Bezeichner nicht im catch-Block angeben, können Sie auf keine Ausnahmedaten zugreifen. Dies ist jedoch manchmal nicht erforderlich. Daher ist es sinnvoll, eine Variable nicht zu deklarieren. t beabsichtigen zuzugreifen.

2

Weil catch keine Methode ist. Sie benötigen neben dem Typ keinen Parameter. Ohne Parameter und nur mit Typ wird die Ausnahme dieses speziellen Typs mit diesem catch-Block behandelt, aber die Details werden ignoriert.

catch (DataException) können Sie den Typ der Ausnahme kennen, aber Sie können die Details nicht erhalten.

zum Beispiel habe ich eine benutzerdefinierte Ausnahme geschrieben und Message überschrieben, um meine Nachricht zu formatieren. mit catch (ExceptionType), können Sie nicht message.with catch (ExceptionType d), greifen Sie mit d.Message

2

Die Art und Weise zur Zeit geschrieben haben, zugreifen können, bedeutet, dass Sie den Compiler zu sagen, dass, wenn eine Ausnahme vom Typ Dataexception wird geworfen, dieser catch-Block muss bearbeitet werden. Und mit der Art, wie Sie es geschrieben haben, haben Sie keine Variable, auf der die Ausnahme gespeichert ist, auf die Sie später zugreifen können.

In der Regel kann eine einzelne Codezeile (nicht einmal ein Zeilenblock) mehrere Ausnahmetypen auslösen. Sie möchten unterschiedliche Verarbeitung für jede Art von Ausnahme.