Wyjątkiem jest błąd blokowania .
Przede wszystkim najlepszą praktyką nie powinno być rzucanie wyjątków dla jakiegokolwiek rodzaju błędu, chyba że jest to błąd blokujący .
Jeśli błąd jest blokowany , wyrzuć wyjątek. Po zgłoszeniu wyjątku nie trzeba go ukrywać, ponieważ jest wyjątkowy; poinformuj użytkownika o tym (należy sformatować cały wyjątek do czegoś przydatnego dla użytkownika w interfejsie użytkownika).
Twoim zadaniem jako programisty jest zapobieganie wyjątkowemu przypadkowi, w którym niektóre parametry lub sytuacja w środowisku wykonawczym mogą zakończyć się wyjątkiem. Oznacza to, że wyjątków nie można tłumić, ale należy ich unikać .
Na przykład, jeśli wiesz, że niektóre liczby całkowite mogą mieć niepoprawny format, użyj int.TryParse
zamiast int.Parse
. Istnieje wiele przypadków, w których możesz to zrobić zamiast po prostu powiedzieć „jeśli to się nie powiedzie, po prostu wyrzuć wyjątek”.
Zgłaszanie wyjątków jest drogie.
Jeśli w końcu zostanie zgłoszony wyjątek, zamiast zapisywać wyjątek w dzienniku po jego zgłoszeniu, jedną z najlepszych praktyk jest łapanie go w module obsługi wyjątków pierwszej szansy . Na przykład:
- ASP.NET: Błąd aplikacji Global.asax
- Inne: zdarzenie AppDomain.FirstChanceException .
Moje stanowisko jest takie, że lokalne try / catch są lepiej dostosowane do obsługi specjalnych przypadków, w których możesz przetłumaczyć wyjątek na inny lub gdy chcesz „wyciszyć” go w bardzo, bardzo, bardzo, bardzo, bardzo szczególnym przypadku (błąd biblioteki zgłoszenie niepowiązanego wyjątku, który musisz wyciszyć, aby obejść cały błąd).
W pozostałych przypadkach:
- Staraj się unikać wyjątków.
- Jeśli nie jest to możliwe: procedury obsługi wyjątków pierwszej szansy.
- Lub użyj aspektu PostSharp (AOP).
Odpowiadanie na @thewhiteambit w sprawie komentarza ...
@thewhiteambit powiedział:
Wyjątki nie są błędami krytycznymi, są wyjątkami! Czasami nie są nawet błędami, ale ich uznanie za błędy krytyczne jest całkowicie fałszywym zrozumieniem, czym są wyjątki.
Po pierwsze, jak wyjątek nie może być nawet błędem?
- Brak połączenia z bazą danych => wyjątek.
- Niepoprawny format ciągu, aby parsować jakiś wyjątek type =>
- Próbowanie parsowania JSON i podczas gdy dane wejściowe nie są tak naprawdę JSON => wyjątkiem
- Argument
null
podczas spodziewanego obiektu => wyjątek
- Niektóre biblioteki mają błąd => zgłasza nieoczekiwany wyjątek
- Jest połączenie z gniazdem, które się rozłącza. Następnie spróbuj wysłać wiadomość => wyjątek
- ...
Możemy wymienić 1k przypadków, gdy zostanie zgłoszony wyjątek, a przecież każdy z możliwych przypadków będzie błędem .
Wyjątkiem jest błąd, ponieważ pod koniec dnia jest to obiekt, który zbiera informacje diagnostyczne - ma komunikat i zdarza się, gdy coś pójdzie nie tak.
Nikt nie rzuci wyjątku, gdy nie ma wyjątkowego przypadku. Wyjątkami powinny być błędy blokowania, ponieważ po ich zgłoszeniu , jeśli nie spróbujesz wpaść w użycie try / catch, a wyjątki w celu wdrożenia przepływu sterowania oznaczają, że Twoja aplikacja / usługa zatrzyma operację, która wystąpiła w wyjątkowym przypadku .
Ponadto sugeruję wszystkim, aby sprawdzili niezawodny paradygmat opublikowany przez Martina Fowlera (i napisany przez Jima Shore'a) . W ten sposób zawsze rozumiałem, jak radzić sobie z wyjątkami, nawet zanim dotarłem do tego dokumentu jakiś czas temu.
[...] uważają je za Fatalne błędy to całkowicie błędne zrozumienie wyjątków.
Zwykle wyjątki ograniczają przepływ operacji i są przetwarzane w celu przekształcenia ich w błędy zrozumiałe dla człowieka. Wydaje się więc, że wyjątek jest w rzeczywistości lepszym paradygmatem do obsługi przypadków błędów i pracy nad nimi, aby uniknąć awarii aplikacji / usługi i powiadomić użytkownika / konsumenta, że coś poszło nie tak.
Więcej odpowiedzi na temat problemów @whiteambit
Na przykład w przypadku braku połączenia z bazą danych program może wyjątkowo kontynuować zapis do pliku lokalnego i wysłać zmiany do bazy danych, gdy będzie ona ponownie dostępna. Nieprawidłowy rzut ciąg-na-numer może zostać ponownie sparsowany przy użyciu lokalnej interpretacji wyjątków, tak jak podczas próby domyślnego języka angielskiego w analizie składni („1,5”) kończy się niepowodzeniem i ponowna próba z interpretacją niemiecką, która jest całkowicie dobrze, ponieważ używamy przecinka zamiast kropki jako separatora. Widzisz, że te wyjątki nie mogą nawet blokować, wymagają jedynie obsługi wyjątków.
Jeśli aplikacja może działać w trybie offline bez utrwalania danych w bazie danych, nie należy używać wyjątków , ponieważ implementacja przepływu kontroli try/catch
jest traktowana jako anty-wzorzec. Praca w trybie offline jest możliwym przypadkiem użycia, więc wdrażasz przepływ kontrolny, aby sprawdzić, czy baza danych jest dostępna, czy nie, nie czekasz, aż będzie nieosiągalna .
Parsowanie rzeczą jest również oczekiwany przypadek ( nie przypadek wyjątkowy ). Jeśli się tego spodziewasz, nie używasz wyjątków, aby kontrolować przepływ! . Otrzymujesz od użytkownika trochę metadanych, aby wiedzieć, jaka jest jego kultura, i używasz do tego formatów! .NET obsługuje także to i inne środowiska oraz wyjątek, ponieważ należy unikać formatowania liczb, jeśli oczekuje się zastosowania aplikacji / usługi specyficznego dla kultury .
Nieobsługiwany wyjątek zwykle staje się błędem, ale same wyjątki nie są codeproject.com/Articles/15921/Not-All-Exceptions-Are-Errors
Ten artykuł jest tylko opinią lub punktem widzenia autora.
Ponieważ Wikipedia może być również opinią autora lub autorów artykułu, nie powiedziałbym, że to dogmat , ale sprawdź, co mówi artykuł Kodowanie według wyjątku gdzieś w jakimś akapicie:
[...] Wykorzystanie tych wyjątków do obsługi określonych błędów, które pojawiają się w celu kontynuacji programu, nazywa się kodowaniem w drodze wyjątku. Ten anty-wzór może szybko obniżyć wydajność oprogramowania i łatwość konserwacji.
Mówi także gdzieś:
Niepoprawne użycie wyjątku
Często kodowanie według wyjątku może prowadzić do dalszych problemów w oprogramowaniu z niewłaściwym użyciem wyjątku. Oprócz korzystania z obsługi wyjątków dla unikalnego problemu, niepoprawne użycie wyjątku przenosi to dalej, wykonując kod nawet po zgłoszeniu wyjątku. Ta zła metoda programowania przypomina metodę goto w wielu językach oprogramowania, ale występuje tylko po wykryciu problemu w oprogramowaniu.
Szczerze mówiąc, uważam, że nie można opracować oprogramowania, nie traktując poważnie przypadków użycia. Jeśli wiesz, że ...
- Twoja baza danych może przejść w tryb offline ...
- Niektóre pliki można zablokować ...
- Niektóre formatowanie może nie być obsługiwane ...
- Sprawdzanie poprawności niektórych domen może się nie powieść ...
- Twoja aplikacja powinna działać w trybie offline ...
- niezależnie od przypadku użycia ...
... nie użyjesz do tego wyjątków . Można by wspierać tych przypadków użycia za pomocą regularnych kontroli przepływu.
A jeśli jakiś nieoczekiwany przypadek użycia nie zostanie uwzględniony, Twój kod szybko zawiedzie, ponieważ spowoduje zgłoszenie wyjątku . Racja, ponieważ wyjątek jest wyjątkowym przypadkiem .
Z drugiej strony, wreszcie, czasami obejmuje się wyjątkowe przypadki, zgłaszając oczekiwane wyjątki , ale nie wyrzuca się ich w celu wdrożenia przepływu kontrolnego. Robisz to, ponieważ chcesz powiadomić górne warstwy, że nie obsługujesz niektórych przypadków użycia lub twój kod nie działa z niektórymi argumentami lub danymi / właściwościami środowiska.