2012-05-03 10 views
18

Zastanawiam się, czy istnieje sposób na wykonanie bloku, jeśli nie został zgłoszony wyjątek?Spróbuj złapać w końcu: Zrób coś, jeśli wyjątek nie zostanie zgłoszony

Najlepszym mogę wymyślić to:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
}finally{ 
    if(!exception){ 
     // i can do what i want here 
    } 
} 

Czy istnieje lepszy sposób?

+0

Czy masz "return" w swoim bloku try? – Guillaume

+0

Odpowiedzi mają 18 głosów między nimi, a pytanie 1 głos? –

+0

@Guillaume nie zwraca – lowerkey

Odpowiedz

33

Na pewno jest: umieść go na dole bloku try.

try{ 
    // something 
    // i can do what i want here 
}catch(Exception e){ 
    // handle exception 
} 

To nie jest całkowicie równoważne do oryginalnego kodu w tym sensie, że jeśli „co chcesz” rzuca wyjątek zostanie złapany lokalnie (to nie stałoby się z oryginalnym schemacie). To jest coś, na co możesz lub nie masz ochoty, i jest duża szansa, że ​​różne zachowania są również prawidłowe.

Jeśli chcesz wnieść starego zachowania powrotem, można również korzystać z tego wariantu, który nie wymaga finally tylko przez wzgląd na piśmie „jeśli nie ma wyjątków” warunek:

var checkpointReached = false; 
try{ 
    // something 
    checkpointReached = true; 
    // i can do what i want here 
}catch(Exception e){ 
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint 
    // handle exception 
} 
+0

+1, dobra odpowiedź. –

+0

Problem polega na tym, że jeśli powtórzysz ten wzorzec, otrzymasz nazwę try-catch. Jest to zalecane tylko w przypadku, gdy oczekuje się kilku wyjątków. –

+0

@dystroy: Nie jesteś pewien, co masz na myśli, możesz rozwinąć? – Jon

3

don Potrzebuję klauzuli "koniec".

Rozwiązanie:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
} 
if(!exception){ 
    // u can do what u want here 
} 

Zazwyczaj będziesz po prostu zwrot w swojej klauzuli catch, dzięki czemu nie trzeba nawet badania:

try{ 
    // something 
}catch(Exception e){ 
    // do things 
    return; 
} 
// u can do what u want here 

lub (w zależności od zastosowania i generalnie mniej zrozumiałe, zwłaszcza jeśli oczekuje się więcej niż jednego wyjątku - nie chcesz mieć narzucenia try-catch ...):

try{ 
    // something 
    // u can do what u want here 
}catch(Exception e){ 
    // do things 
} 
1

Nie - to, co masz, jest prawdopodobnie najlepszym sposobem zrobienia tego w języku C#.

Jest to przy założeniu, że:

  • Ty nie chcesz „mogę robić co chcę tutaj” Kod uruchomić na dole bloku try. (Być może dlatego, że nie chcą wyjątki w tym kodzie być obsługiwane przez główny catch bloku.)
  • Ty nie chcesz „Mogę robić co chcę tutaj” kod uruchomić całkowicie poza try...catch...finally Struktura. (Może dlatego, że chcesz uruchomić kod zanim jakiś inny kod, który siedzi wewnątrz bloku finally.)
4

można zorganizować swój kod że doSomething to ostatnie stwierdzenie w bloku i nie rzucać?

bool exception = false; 
try{ 
    // something 
    doSomething(); 
} catch { 
} 
finally { 
} 
+0

@ Jeff Fosterno potrzeba w końcu bloku tutaj. –

+1

Założę się, że istnieje jakiś kod porządkowy, który chciał uruchomić. Jeśli nie, to masz rację, jest zbędny. –

2

Tak jest: umieścić go na końcu bloku try :)

1

Chociaż nie ma nic złego w kodzie, to niepotrzebne.Wystarczy umieścić kod, który chcesz wykonać w dolnej części bloku try:

try { 
    ... 
    // No errors to this point, run what you wanted to run in the finally. 
} 
catch(Exception e) { 
    ... 
} 
0

wierzę szukasz try wewnątrz swojej próbie:

try{ 
    // something 

    try{ 
     // something else not interfering with first try 
    } catch(Exception innerEx){ 
     // something else threw this innerEx 
    } 

}catch(Exception outerEx){ 
    // something threw this outerEx 
} 

Chociaż ten jest powszechnie uważany złe praktyki, Podoba mi się to bardziej niż wersja flagowa.

Powiązane problemy