Utknąłem przy podejmowaniu decyzji, jak obsłużyć wyjątki w mojej aplikacji.
Wiele, jeśli moje problemy z wyjątkami wynikają z 1) dostępu do danych za pośrednictwem usługi zdalnej lub 2) deserializacji obiektu JSON. Niestety nie mogę zagwarantować sukcesu dla żadnego z tych zadań (przerwanie połączenia sieciowego, źle sformułowany obiekt JSON, który jest poza moją kontrolą).
W rezultacie, jeśli napotkam wyjątek, po prostu łapię go w funkcji i zwracam FALSE do dzwoniącego. Moja logika jest taka, że dzwoniącego naprawdę obchodzi tylko to, czy zadanie się powiodło, a nie dlaczego się nie powiodło.
Oto przykładowy kod (w języku JAVA) typowej metody)
public boolean doSomething(Object p_somthingToDoOn)
{
boolean result = false;
try{
// if dirty object then clean
doactualStuffOnObject(p_jsonObject);
//assume success (no exception thrown)
result = true;
}
catch(Exception Ex)
{
//don't care about exceptions
Ex.printStackTrace();
}
return result;
}
Myślę, że to podejście jest w porządku, ale jestem naprawdę ciekawy, jakie są najlepsze praktyki zarządzania wyjątkami (czy naprawdę powinienem bąbelkować wyjątek na całej wysokości stosu wywołań?).
Podsumowując kluczowe pytania:
- Czy można po prostu wyłapać wyjątki, ale nie podświetlać ich ani formalnie powiadamiać systemu (za pośrednictwem dziennika lub powiadomienia dla użytkownika)?
- Jakie sprawdzone metody są dostępne dla wyjątków, które nie powodują, że wszystko wymaga blokady try / catch?
Śledzenie / edycja
Dziękuję za wszystkie opinie, znalazłem doskonałe źródła dotyczące zarządzania wyjątkami w Internecie:
- Najlepsze praktyki dotyczące obsługi wyjątków | O'Reilly Media
- Najlepsze rozwiązania dotyczące obsługi wyjątków w .NET
- Sprawdzone metody: zarządzanie wyjątkami (artykuł wskazuje teraz kopię archive.org)
- Antywzory obsługujące wyjątki
Wydaje się, że zarządzanie wyjątkami jest jedną z tych rzeczy, które różnią się w zależności od kontekstu. Ale co najważniejsze, należy konsekwentnie zarządzać wyjątkami w systemie.
Dodatkowo uważaj na gnicie kodu poprzez nadmierne try / catch lub nie nadawanie wyjątku jego szacunku (wyjątkiem jest ostrzeżenie systemu, co jeszcze należy ostrzec?)
Jest to również dobry komentarz ze strony m3rLinEz .
Zgadzam się z Andersem Hejlsbergiem i Tobą, że większości dzwoniących zależy tylko na tym, czy operacja się powiedzie, czy nie.
Z tego komentarza nasuwa się kilka pytań, o których należy pomyśleć podczas radzenia sobie z wyjątkami:
- Jaki jest sens zgłaszania tego wyjątku?
- Jak to ma sens, aby sobie z tym poradzić?
- Czy dzwoniącego naprawdę obchodzi wyjątek, czy po prostu obchodzi go, czy połączenie się powiodło?
- Czy zmuszanie dzwoniącego do zarządzania potencjalnym wyjątkiem jest wdzięczne?
- Czy szanujesz idomy języka?
- Czy naprawdę musisz zwrócić flagę sukcesu, taką jak wartość logiczna? Zwracanie wartości logicznej (lub int) jest bardziej nastawieniem na język C niż w Javie (w Javie wystarczyłoby obsłużyć wyjątek).
- Postępuj zgodnie z konstrukcjami zarządzania błędami związanymi z językiem :)!