2012-01-25 12 views
10

Powiel możliwe:
When to use try/catch blocks?
Main method code entirely inside try/catch: Is it bad practice?
When to use Try Catch blocksCzy powinienem zawsze owijać mój kod w try ... catch blocks?

Wyjątki mogą wystąpić w dowolnym miejscu, więc to mnie myśleć: mam zawsze owinąć mój kod w blokach try..catch ?

To jest dla C#.

(mogę być czegoś brakuje fundamentalnej tutaj, jak nadal jestem początkujących)

EDIT: Okazuje się, że to nie był rzeczywiście bardzo inteligentne pytanie. Jedyną rzeczą, jakiej nauczyliśmy się w szkole, jest użycie try ... catch, aby zapobiec awariom. To, co zrobiliśmy z tym wyjątkiem, pokazało MessageBox, aby poinformować użytkownika, że ​​"coś poszło nie tak podczas pisania tego pliku".

+1

W jakim języku mówimy tutaj? – Timst

+0

@ Największy C#. Nie zdawałem sobie sprawy, że to coś zmieniło, zaktualizuje moje pytanie. –

+1

@KenWhite Zrobiłem wyszukiwanie, ale nie zwróciło to pytanie. –

Odpowiedz

50

Wyjątki mogą wystąpić w dowolnym miejscu, więc to spowodowało, że pomyślałem: czy powinienem zawsze owijać mój kod w bloki try..catch?

Dobre pytanie. Oto pokrewne pytanie:

Maniacy dzierżący topór mogą być niemal wszędzie, więc: czy powinienem nosić topór pancerny odporny na siedzenie 24 godziny na dobę?

Mam szczęście mieszkać w okolicy, w której liczba ax-dzierżąc maniaków jest na tyle niska, że ​​nie noszą zbroi, kiedy wychodzisz z domu. Ale przypuśćmy, że nie. Czy właściwym rozwiązaniem jest noszenie pancerza przez cały czas lub więzienia maniaków?

Jeśli twoje programy rzucają tak wiele wyjątków, że musisz obsługiwać te wyjątki wszędzie, to masz duży problem. Rozwiązaniem tego problemu nie jest zbroja i umieszczanie wyjątków w każdym miejscu. Rozwiązaniem tego problemu jest wyeliminowanie kodu, który rzuca wyjątki, a jeśli nie można go wyeliminować, to izoluje go do małego regionu kodu, który używa wyjątku obsługi.

+12

+1 dla maniaków dzierżących topór. – Aaron

+4

[Vexing Exceptions] (http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx) - artykuł Erica Lipperta na ten temat. – Brian

+0

+1 Wielkie użycie analogii. Ułatwia wyjaśnienie. – Sabuncu

3

Absolutnie nie. Oto świetny CodeProject article on working with exceptions, abyś mógł zacząć.

Ale bardziej do twojego punktu w PO, Wyjątki powinny być obsługiwane tylko tam, gdzie muszą być obsługiwane. Oznacza to, że dobrze wdrożona aplikacja będzie miała kilka punktów w aplikacji (w zależności od zakresu kursu), w których będzie obsługiwanych wiele wyjątków pochodzących z wyjątków, a jeszcze mniej miejsc (jeden na wątek na liczbę najlepszych praktyk sugestie), w których zostanie rozwiązany ogólny wyjątek.

Podczas pracy z wyjątkami nie myśl w kategoriach zwracających informacje o błędach funkcji. Wyjątki znacznie łagodzą nudę przenikającą stan błędu przez twój łańcuch połączeń.

2

Nie, nie powinieneś owijać całego kodu w try-catch. Odpowiedziałem na podobne pytanie tutaj na dba.stackexchange.com - how much overhead an error in RDBMS has.

Generalnie powinieneś używać tylko obsługi wyjątków, jeśli jest coś konkretnego, co chcesz zrobić z komunikatem o błędzie, lub jeśli kod, który się nie powiódł, daje wyniki, które nie są używane nigdzie indziej. Jeśli aplikacja jest skierowana do użytkownika, oczywiście nie chcesz, aby widziały nieprzetworzone wiadomości o wyjątkach. We wszystkich tych przypadkach powinieneś rejestrować niepowodzenie ... nie ma sensu w pułapce dla wyjątku, którego nie planujesz obsługiwać (pusty catch = zły). Ale w przeciwnym razie będziesz chciał rzucić wyjątek.

Na przykład nawiązanie połączenia z bazą danych kończy się niepowodzeniem z wyjątkiem SQL. Następna część twojego kodu jest zaprojektowana do przetwarzania tego wyniku, więc będziesz chciał, aby wyjątek został zgłoszony, a wykonanie programu zatrzymane.

Jeśli twój kod regularnie generuje wyjątki (i wyłącza z tego logikę), prawdopodobnie powinieneś przemyśleć swoje podejście.