2012-11-18 13 views
6

Przeczytałem omówione następujące pytania i artykuły głęboko i wielu innych, obecnie iw przeszłości:Jakie typy bloków kodu należy dołączyć do instrukcji try-catch?

When to use try/catch blocks?

Main method code entirely inside try/catch: Is it bad practice?

When to use Try Catch blocks

zrobię ten artykuł standard kodowania obsługa wyjątków w mojej organizacji! Avery nice one, ale nie odpowiedział mi: http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET

What is the Best practice for try catch blocks to create clean code?

Best practices for exception management in Java or C# tutaj: mi się nie podoba to statment :( nie należy próbować złapać za każdym wyjątku w każdym możliwym miejscu.

Should multiple Try/Catch blocks in a method be combined

mam problem, gdy trzeba zdecydować się ująć pewne blok kodu z oświadczeniem try-catch, wiem, że kod należy dołączyć jest th e wadliwy kod, i muszę sprawdzić, co mogę sprawdzić, ale na przykład: Potrzebuję napisać wiersz w jakimś pliku tekstowym, powinienem sprawdzić, czy plik istnieje, i czy mam pozwolenie na pisanie na nim, czy powinienem sprawdź, czy jest miejsce na dysku, czy dysk jest zapisywalny, a jeśli sprawdziłem miejsce, co jeśli coś się stało podczas pisania tego pliku (Jakiś inny app lub wątek używane miejsce, lub dysk wymienny został usunięty?), Czy jest to najlepsza praktyka, jeśli sprawdzałem te rzeczy i radziłem sobie z wyjątkami IOException i SecurityException oraz innymi potencjalnymi wyjątkami, czy powinienem sprawdzać tylko bez próbnego catchowania?

Inny przykład: Używam EntityFramework do dostępu do bazy danych, kiedy dostęp do czegoś może skontaktować się z bazą danych, wiem, że powinienem sprawdzić połączenie, jeśli jest zamknięte i spróbować go otworzyć, ale jest wiele i wiele rzeczy może spowodować awarię w tym oświadczeniu baza danych może znajdować się na dysku wymiennym, dysk ten może zostać usunięty podczas odczytu, usługa DBMS może zostać zatrzymana z jakiegokolwiek powodu, nie może zostać zgłoszony wyjątek przestrzeni, schemat bazy danych może ulec zmianie po tym, jak spróbuję wykonaj mój kod z jakiegoś powodu ****, Jak mogę zapobiec błędowi mojego kodu, czy mogę po prostu sprawdzić wszystko, co mogę sprawdzić i kontynuować? lub powinienem użyć catch catch dla wyjątku, którego mogę się spodziewać, mimo że je sprawdziłem?

Proszę podać odpowiedzi na swoje odpowiedzi, a nie ogólne odpowiedzi!

EDIT

I na pewno przeczytać: http://msdn.microsoft.com/en-us/library/seyhszts.aspx

+0

Dodaj komentarz, jeśli przegłosujesz! –

+0

Dbasz tylko o to, dlaczego nie udało się, jeśli możesz lub chcesz wykonać pracę, aby poprawić kod. W przeciwnym razie możesz po prostu zarejestrować wyjątek i ponownie rzucić. Większość aplikacji nie potrzebuje tego rodzaju odporności, którą proponujesz. – PatFromCanada

Odpowiedz

4

Dobre pytanie! Jeden z twoich linków (Daniel Turini) jest jednym z moich ulubionych. Wracam do niego raz za razem, kiedy moje myślenie wymaga trochę prostowania.

Dobrym sposobem wyrażania mój stosunek do obsługi wyjątków jest: tylko uchwyt wyjątki, które można obsłużyć. Oznacza to, że nigdy nie możesz się dowiedzieć, co zrobić w odpowiedzi na ewentualny wyjątek, który się pojawia, i zaimplementuj to w swoim kodzie. Istnieje kilka "oczekiwanych" wyjątków, z którymi można się uporać - ale to, co w tym przypadku robi kod, jest decyzją projektową samą w sobie.IMHO priorytetem w obchodzeniu się z nimi nie jest pozostawianie bałaganu po zamknięciu aplikacji (lub przynajmniej wycofaniu się z konkretnej transakcji, w którą był zaangażowany) - nie, aby aplikacja mogła być kontynuowana niezależnie, ponieważ zamykanie z wdziękiem "Nie wiem dlaczego, ale ten wyjątek się wydarzył" powiadomienie (do log/e-mail IT/MsgBox, cokolwiek) jest jakoś "złe rzeczy".

Bezpośrednim przeciwieństwem tego rodzaju projektu jest rodzaj obsługi wyjątków, który stara się, aby aplikacja była swego rodzaju "żołnierzem-armagedonem-ocalonym". Próby do ... Widziałem kod, który reaguje na błędy IO, zakładając, że serwer plików sieciowych jest wyłączony, a gałęzie próbują pracować, w jakiś niezaprojektowany sposób, na dysku C :. I kod, który próbuje WYBRAĆ Z ATable: jeśli tabela nie istnieje, KREUJE to !!! Za każdym razem, gdy ktoś pisze taki kod, umiera dziecko possum.

Turini mówi "nigdy nie połykaj wyjątków". To, co myślę, jest rozszerzeniem tego: IMHO, musisz bardzo uważać, aby aplikacja działała dalej, nawet w odpowiedzi na znany, określony typ wyjątku, ze znaną przyczyną: ponieważ nawet to stanowi wyjątek "przełykania" . Zrób to, ale rób to ostrożnie i dobrze.

Tak więc w moim mniemaniu zawsze jest miejsce na ogólny wyjątek "any other case", który deleguje decyzję do wyższej mocy (człowieka), rejestrując szczegóły tego, co się stało i po prostu wyłączając Aplikacja.

Moja 2c ..

+0

Założę się, że właściwym podejściem powinno być zapewnienie, że nieoczekiwane wyjątki unieważnią wszelkie struktury danych, które mogły zostać uszkodzone w wyniku nieoczekiwanego odejścia od normalnej sekwencji wykonywania. Jeśli kod może przetrwać bez tych struktur danych, powinien. Jeśli nie, unieważnienie struktur danych zapewni szybką śmierć. Jeśli kod wywoła "LoadDocument" i otrzyma wyjątek, nie powinien znać wszystkich możliwych powodów, dla których operacja mogła nie wiedzieć, czy powinna się zawiesić, czy po prostu zgłosić, że nie można odczytać pliku. – supercat

0

IMHO: złapać każdy wyjątek w końcowej warstwie aplikacji, aby uniemożliwić aplikację przed rozbił, (w interfejsie użytkownika, w ciele swojej konsoli aplikacji lub w ciele jakaś metoda obsługi ... itd.) i poradzić sobie z nią, jeśli możesz lub przynajmniej zalogować, ale w wewnętrznych warstwach przechwyć tylko te wyjątki, które znasz, aby doskonale nimi manipulować, i wyrzuć lub zawiń wyjątki bez doskonałości sposób obsługi, ale jeśli twój kod nie ma wyraźnych granic między warstwami (to samo w moim przypadku) powinieneś spróbować obsługiwać wyjątki, kiedy tylko może się zdarzyć, i spróbuj zresetować (przepisać) tę aplikację (jak to zrobimy wkrótce!) w dobrze skonstruowany sposób!

Powiązane problemy