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:
// Note that the operation fails pretty often, since it deals with the servers which are
// frequently unavailable, and the ones which send garbage instead of the actual data.
private LoadOperationResult LoadProductsFromWeb()
{
...
}
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:
catch (SomeException ex)
{
...
throw ex;
}
ponieważ łamiesz stos. Zrób to zamiast tego:
catch (SomeException)
{
...
throw;
}
Staraj się pisać wiadomości o wyjątkach. Ile razy widziałem coś takiego throw Exception("wrong data")
lub throw 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:
/// <exception cref="MyException">Description of the exception</exception>
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.