2011-01-06 13 views
6

Tylko upewniam się, że rozumiem to dobrze. Czy poprawny schemat jest prawidłowy? Łapanie najbardziej specyficznych wyjątków w pierwszej kolejności w celu uchwycenia szerszych wyjątków z ogólnym haczykiem na końcu zestawu bloków catch.Czy kolejność bloków Catch jest ważna?

try 
{ 
some code 
} 


catch(SomeSpecificException ex) 
{ 
} 
catch(LessSpecificException ex) 
{ 
} 
catch 
{ 
    //some general exception 
} 
+5

Tak, to jest prawidłowa kolejność. –

+0

duplikat http://stackoverflow.com/questions/3960259/catching-exceptions-c/3960283#3960283? – sloth

+0

Jeśli masz na myśli "bardziej szczegółowy" jako "pochodzi od mniej specyficznej klasy wyjątków", to tak. Jeśli jednak nie odziedziczysz po drugim, możesz umieścić je w dowolnej kolejności. Można argumentować, że 'FileNotFoundOnAnyServerException' jest _semantically_ bardziej specyficzny niż' FileNotFoundException'. Ale jeśli nie dziedziczy po "FileNotFoundException", nie ma ryzyka konfliktu, a zatem kompilator nie dba o to. – Flater

Odpowiedz

5

Wierzę, że nie pozwoli ci to napisać w nieprawidłowej kolejności.

ten generuje błąd:

try 
{ 
    throw new OutOfMemoryException(); 
} 
catch(Exception ex) 
{ 
    "B".Dump(); 
} 
catch(OutOfMemoryException ex) 
{ 
    "A".Dump(); 
} 
+1

"Poprzednia klauzula catch już przechwytuje wszystkie wyjątki tego lub super typu (" System.Exception "). –

+0

Ah Nie wiedziałem o tym wcześniej. Dzięki – Kurru

+0

@ Martinho Fernandes Myślę, że kompilator nie pozwoli mi go skompilować. – Loj

Powiązane problemy