2015-09-15 29 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(); 
} 

Kod jest kompilowany bez błędów. Nie rozumiem, dlaczego pierwsza linia bloku catch nie daje żadnych błędów kompilacji -C# catch (DataException) - brak zdefiniowanej zmiennej

catch (DataException)

parametr DataException bloku catch jest klasa, i powinien mieć zmienną obok do takich jak ona -

połowu (DataException d)

Może ktoś wyjaśnić powyższą zachowanie?

+1

Dotyczy to składnia, gdy tylko obchodzi, jaki rodzaj wyjątek, ale nie potrzebują ślad stosu, itp – Blorgbeard

+0

W przypadku, gdy nie potrzebujemy 'd' – Eric

Odpowiedz

5

W sekcji 8.10 C# 5.0 spec znajdziesz definicję składni dla try/catch (przeprosiny za formatowanie):

pytań punktach:
        szczególne klauzule-catch-              ogólnie -catch-clause
        specyficzne klauzule-catch opt     ogólnego catch-klauzuli
specyficzne-catch-klauzule:
        specyficzny-catch-klauzula
        specyficzne-catch-klauzule         specyficzny-catch-klauzula
klauzula szczegółowa:
        catch         (         klasa typu         Identyfikator opt         )         blok
ogólnego catch-klauzula:
        catch         blok

Więc widać, że catch { }, catch (Exception) { } i catch (Exception ex) { } są ważne zgodnie ze specyfikacją.

Jeśli nie określisz opcjonalnego identyfikatora w bloku catch, nie będziesz mieć dostępu do żadnych szczegółów wyjątków - ale czasami nie musisz, więc dobrze jest nie zadeklarować zmiennej, którą nie masz. t zamierzają uzyskać dostęp.

2

Ponieważ catch nie jest metodą. nie potrzebujesz parametru obok typu. bez parametru i tylko z typem, wyjątek tego konkretnego typu będzie obsługiwany z tym blokiem catch, ale szczegóły są ignorowane.

catch (DataException) pozwala poznać typ wyjątku, ale nie można uzyskać szczegółowych informacji.

Na przykład napisałem niestandardowy wyjątek i zastąpiłem Message, aby sformatować moją wiadomość. z catch (ExceptionType), nie można uzyskać dostępu message.with catch (ExceptionType d), można uzyskać dostęp z d.Message

2

sposób są obecnie napisane to oznacza, że ​​mówisz kompilator, że gdy wyjątek typu DataException zostanie wyrzucony, to blok catch musi zostać przetworzone. W taki sposób, w jaki został napisany, nie będziesz miał żadnej zmiennej, która ma zapisany wyjątek, abyś mógł uzyskać dostęp później.

Zazwyczaj pojedynczy wiersz kodu (nawet blok wierszy) nie może zawierać wielu typów wyjątków. Chcesz innego przetwarzania dla każdego rodzaju wyjątków.