Mimo że od kilku lat programuję na poziomie profesjonalnym, nadal nie rozumiem w pełni obsługi błędów. Mimo że moje aplikacje działają dobrze, obsługa błędów nie jest zaimplementowana na poziomie profesjonalnym i stanowi połączenie wielu technik.
Moja obsługa błędów nie ma żadnej struktury. Chciałbym się dowiedzieć i zrozumieć, w jaki sposób jest wdrażany na poziomie profesjonalnym. To jest jedna dziedzina, w której brakuje mi wiedzy.
Kiedy powinienem skorzystać z wyjątków i kiedy powinienem zwrócić status powodzenia, aby sprawdzić w przepływie logiki? Czy można mieszać wyjątki i zwracać status?
Głównie koduję w C #.
c#
.net
coding-standards
error-handling
James Jeffery
źródło
źródło
Odpowiedzi:
Używaj wyjątków od wyjątkowych rzeczy, których nie możesz spodziewać się zbyt często, rzeczy, które wskazują, że coś idzie nie tak. Na przykład, jeśli sieć nie działa, jest to wyjątkowa rzecz dla serwera WWW. Jeśli baza danych jest niedostępna, oznacza to, że coś jest nie tak. Jeśli brakuje pliku konfiguracyjnego, prawdopodobnie oznacza to, że użytkownik się z nim pomylił.
Nie używaj wyjątków do obsługi niepoprawnego kodu. Aby sprawdzić poprawność kodu, powinieneś użyć albo asercji, albo, w .NET Framework 4 i późniejszych, umów Code (które zastępują asercje i mają dodatkowe, szczególnie cenne funkcje).
Nie używaj wyjątków w wyjątkowych przypadkach. Fakt, że użytkownik, poproszony o podanie numeru, wpisał „pies”, nie jest tak wyjątkowy, aby zasługiwał na wyjątek.
Zachowaj ostrożność przy wyborze rodzajów wyjątków. W razie potrzeby twórz własne typy. Ostrożnie wybrał dziedzictwo, pamiętając, że złapani rodzice złapią również dzieci. Nigdy
throw Exception
.Nie używaj kodów powrotu dla błędów. Kody błędów można łatwo zamaskować, zignorować, zapomnieć. Jeśli wystąpi błąd, należy go obsłużyć lub propagować na wyższy stos.
W przypadkach, w których oczekuje się, że metoda zwróci błąd, a błąd nie jest wyjątkowy, używaj wyliczeń, nigdy liczb błędów. Przykład:
Sens
LoadOperationResult.ServerUnavailable
,LoadOperationResult.ParsingError
itp jest dużo bardziej wyraźny niż, powiedzmy, pamiętając, że kod 12 oznacza, że serwer jest w dół, i kod 13 - że dane nie mogą być przetwarzane.Używaj kodów błędów, gdy odnoszą się do typowych, znanych przez każdego programistę pracującego w określonej domenie. Na przykład nie wymyślaj ponownie wartości wyliczania dla HTTP 404 Not Found lub HTTP 500 Internal Server Error.
Uważaj na booleany. Wcześniej czy później będziesz chciał wiedzieć nie tylko, czy dana metoda się powiodła, czy nie, ale dlaczego. Wyjątki i wyliczenia są do tego znacznie silniejsze.
Nie wychwytuj każdego wyjątku (chyba że jesteś na samym szczycie stosu). Jeśli złapiesz wyjątek, powinieneś być gotowy, aby go obsłużyć. Łapanie wszystkiego pokazuje, że nie obchodzi Cię poprawność działania kodu. Może to rozwiązać problem „Nie chcę teraz wyszukiwać, jak to naprawić”, ale prędzej czy później cię skrzywdzi.
W języku C # nigdy nie wrzucaj wyjątków takich jak ten:
ponieważ łamiesz stos. Zrób to zamiast tego:
Staraj się pisać wiadomości o wyjątkach. Ile razy widziałem coś takiego
throw Exception("wrong data")
lubthrow Exception("shouldn't call this method in this context")
. Inni programiści, w tym ty sześć miesięcy później, nie mieliby pojęcia, jakie dane są nieprawidłowe i dlaczego lub dlaczego nie powinniśmy wywoływać jakiejś metody w kontekście, ani w jakim kontekście.Nie pokazuj użytkownikom komunikatów o wyjątkach. Nie oczekuje się ich od zwykłych ludzi, a często są nawet nieczytelne dla samych programistów.
Nie lokalizuj komunikatów wyjątków. Przeszukiwanie dokumentacji zlokalizowanej wiadomości jest wyczerpujące i bezcelowe: każda wiadomość powinna być tylko w języku angielskim i angielskim.
Nie skupiaj się wyłącznie na wyjątkach i błędach: dzienniki są również niezwykle ważne.
W .NET nie zapomnij uwzględnić wyjątków w dokumentacji XML metody:
Uwzględnienie wyjątków w dokumentacji XML znacznie ułatwia osobie korzystającej z biblioteki. Nie ma nic bardziej irytującego niż próba odgadnięcia, który wyjątek mógłby zostać zgłoszony metodą i dlaczego.
W tym znaczeniu¹ obsługa wyjątków Java zapewnia bardziej rygorystyczne, lepsze podejście. Zmusza cię to albo do radzenia sobie z wyjątkami potencjalnie zgłaszanymi przez wywoływane metody, albo do zadeklarowania we własnej metodzie, że może zgłaszać wyjątki, których nie obsłużysz, czyniąc rzeczy szczególnie przejrzystymi.
¹ To powiedziawszy, uważam, że rozróżnienie między wyjątkami i błędami w Javie jest dość bezużyteczne i mylące, biorąc pod uwagę, że język sprawdził i odznaczył wyjątki. Na szczęście .NET Framework ma tylko wyjątki i żadnych błędów.
źródło
Myślę, że lista MainMa jest bardzo kompletna. Dodam tylko kilka własnych:
Zamiast tego zrób to:
Nie używaj wyjątków dla przepływu sterowania. Na przykład nie rzucaj wyjątku ClientNotFoundException w oknie dialogowym wyszukiwania (nie znaleziono klienta nie jest wyjątkiem w tej sytuacji) i oczekuj, że kod wywołujący wyświetli komunikat „Nie znaleziono wyników”, gdy to nastąpi.
Nie połykaj wyjątków!
Pamiętaj, że prawdziwa obsługa wyjątku może oznaczać tylko 3 rzeczy:
Jeśli żadna z tych opcji nie ma zastosowania, prawdopodobnie nie powinieneś złapać tego wyjątku. Należy go jednak zarejestrować, a następnie anulować operację lub zamknąć. Oczywiście zależy to od twoich wymagań w odniesieniu do poprawności vs odporności.
źródło