2010-04-30 15 views
11

Mam na przykład try/catch w mojej metody:Wyjście try/catch, aby zapobiec kod po czym z run

} 
    catch (OurCustomExceptionObject1 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 1"; 
    } 
    catch(OurCustomExceptionObject2 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 2"; 
    } 
    catch (OurCustomExceptionObject3 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 3"; 
    } 

    ... rest of code here is being executed after the try/catch 

nie chcę reszty kodu do uruchomienia, jeśli któryś z wyjątków są złapani. Zajmuję się wyjątkami. Słyszałem, że nie używam wyjścia Spróbuj z jakiegoś powodu. Czy to prawda, czy to źle? Czy jest to właściwy sposób na zatrzymanie wykonywania kodu po oświadczeniu połowowym?

+1

'Exit Try' istnieje tylko w VB.NET. Nie dotyczy to języka C#. W języku C# odpowiednią funkcją języka będzie "break", ale jest to niedozwolone w bloku 'try..catch..finally'. Następną najlepszą rzeczą byłoby 'return', co nie robi tego samego, ale jest całkowicie legalne. – stakx

+0

@stakx 'break' nie jest nielegalne w bloku' catch'. Można go użyć do przerwania pętli. –

Odpowiedz

30

Albo return w bloku catch, ponownie wyrzuć wyjątek, albo przenieś kod spod bloku try-try wewnątrz bloku try.

+0

Dokładnie, co miałem odpowiedzieć – BlitzKrieg

+2

Tak. I myślę, że przeniesienie kodu jest najlepszym podejściem w tym przypadku. Jeśli chcesz zatrzymać kontynuowanie kodu, gdy wystąpi wyjątek - nie rób nic. Wyjątek już przerywa przepływ wykonywania. Po prostu otaczaj całą rzeczą try-catch, jeśli chcesz obsłużyć operację. Chociaż, jeśli jest to metoda, otoczyłbym wywołanie metody, a nie treść metody, więc wyjątki nie zostały przypadkowo połknięte. –

+0

tak, to prawda. ale w moim przypadku pozostałą część kodu. czy można umieścić większość kodu w instrukcji try? ponieważ wtedy każdy połów w tej części zostanie przechwycony pod jednym połowem na końcu i na przykład nie będę w stanie określić, który wyjątek dotyczy miejsca. – Disasterkid

1

dwie opcje natychmiast przychodzą na myśl:

  1. return prosto od wewnątrz każdej catch (jak sugeruje BlueRaja)
  2. ustawić flagę (np errorOccurred) w ciągu catch bloków dla wyjątków nie robić aby zezwolić, a następnie umieścić if (errorOccurred) return; po całym bloku try/catch

Ten ostatni potęga być bardziej rea dla innych deweloperów, ponieważ łatwo jest przejść przez to, co dzieje się wewnątrz, aby dowiedzieć się, co dzieje się później. Widzenie rażącego if (errorOccurred) return; sprawia, że ​​trudno jest nie zrozumieć, co się stało.

1

Z widoku wysokiego poziomu, myślę, że może to być naruszenie (przynajmniej) Zasada Odpowiedzialności Pojedynczej, jeśli twój kod próbuje zrobić coś, co może się nie udać, a następnie przejść do dalszych czynności.

Dla odpowiedź jednak, jeśli chciał zrobić hack (który jest zawsze złe, więc nie) można zrobić

bool success = true; 
try 
{ 
    // the good ol' college try 
} 
catch (...) 
{ 
    success = false; 
} 

if (success) 
{ 
    // do the rest of your stuff 
} 

edit: lub alternatywnie jak sugeruje BlueRaja, wstaw wszystkie z Twojego kodu do bloku try. Jeśli pierwszy bit się nie powiedzie, nie powiedzie się. Reszta kodu i tak nie będzie działać.

+0

Nie wiem o tym. Wszystko zależy od sytuacji i logiki, która musi nastąpić. Nie widzę powodu, dla którego przetwarzanie później zaszkodzi cokolwiek, jeśli wszystko, co robisz, aby poradzić sobie z oczekiwanymi błędami, to logowanie i przejście do następnego kodu w metodzie po catch. – PositiveGuy

Powiązane problemy