W latach, które spędziłem programując i rozwijając systemy, były tylko dwie sytuacje, w których uważałem ten wzorzec za użyteczny (w obu przypadkach eliminacja zawierała również rejestrowanie zgłoszonego wyjątku, nie uważam zwykłego chwytania i null
powrotu za dobrą praktykę ).
Dwie sytuacje są następujące:
1. Gdy wyjątek nie został uznany za stan wyjątkowy
Dzieje się tak, gdy wykonujesz operację na niektórych danych, które mogą wyrzucić, wiesz, że mogą one wyrzucić, ale nadal chcesz, aby aplikacja nadal działała, ponieważ nie potrzebujesz przetworzonych danych. Jeśli je otrzymasz, to dobrze, jeśli nie, to także dobrze.
Mogą pojawić się pewne opcjonalne atrybuty klasy.
2. Kiedy udostępniasz nową (lepszą, szybszą?) Implementację biblioteki przy użyciu interfejsu już używanego w aplikacji
Wyobraź sobie, że masz aplikację korzystającą ze starej biblioteki, która nie zgłaszała wyjątków, ale zwracała null
błąd. Utworzyłeś więc adapter dla tej biblioteki, kopiując prawie oryginalne API biblioteki, i używasz tego nowego (wciąż nie rzucającego) interfejsu w swojej aplikacji i null
sam przeprowadzasz kontrole.
Nadchodzi nowa wersja biblioteki, a może zupełnie inna biblioteka oferująca tę samą funkcjonalność, która zamiast zwracać null
s, generuje wyjątki i chcesz z niej korzystać.
Nie chcesz przeciekać wyjątków od głównej aplikacji, więc wyłącz je i zaloguj w utworzonym adapterze, aby zawinąć tę nową zależność.
Pierwszy przypadek nie stanowi problemu, jest to pożądane zachowanie kodu. Jednak w drugiej sytuacji, jeśli wszędzie null
zwracana wartość adaptera biblioteki naprawdę oznacza błąd, refaktoryzacja interfejsu API w celu wygenerowania wyjątku i wyłapanie go zamiast sprawdzania null
może być (i zwykle jest to kodowo) dobrym pomysłem.
Osobiście używam tłumienia wyjątków tylko w pierwszym przypadku. Użyłem go tylko w drugim przypadku, gdy nie mieliśmy budżetu, aby reszta aplikacji działała z wyjątkami zamiast null
s.