Myślę, że ważnym czynnikiem jest to, kim są Twoi klienci usług.
Jeśli twoja warstwa usług jest tylko architektoniczną granicą między warstwami w twoim projekcie, a klient usługi znajduje się w tej samej sferze zaufania, wtedy możesz się zrelaksować i pozwolić, aby niezaznaczone wyjątki wyskoczyły na warstwę kontrolera lub klienta usługi.
Jednak w przypadku publicznego kodu; usługa, z której korzysta osoba trzecia lub klient, myślę, że łatwiej jest ominąć wszelkie niesprawdzone wyjątki wyjątkiem zorientowanym na usługi, przede wszystkim ze względów bezpieczeństwa, po drugie z powodu luźnego łączenia i czystej abstrakcji.
Wyjątek warstwy danych nigdy nie powinien bezpośrednio docierać do użytkownika końcowego aplikacji internetowej . Potencjalnie zawiera wewnętrzne informacje o twoim schemacie, twoich zapytaniach, numerach linii, nazwach zmiennych lub funkcji itp. Wyjątki dla użytkowników końcowych mogą zostać zdezynfekowane w bezpiecznym ustawieniu.
Klient usług zewnętrznych nie przejmuje się szczegółami implementacji i i tak nie może obsłużyć niesprawdzonych wyjątków, ponieważ są to błędy lub problemy środowiskowe. W bezpiecznych aplikacjach błędy bazy danych po prostu nie są wystarczająco bezpieczne, aby się rozprzestrzeniać, OracleException - ORA-01234 - ...
co może być wstawioną trzecią tabelą. Klient powinien mieć możliwość radzenia sobie ze wszystkimi sprawdzonymi / oczekiwanymi wyjątkami, które może obsłużyć, i traktować wszystko inne jako potencjalny raport o błędzie. Umowa o świadczenie usług powinna być atomową, spójną, transakcyjną abstrakcją. Jeśli nie jest w stanie nic zrobić z wyjątkiem wyjątku, jedyną przydatną rzeczą, która pozostała, jest zgłoszenie błędu. Masz już możliwość zarejestrowania wyjątku, więc po co obciążać użytkownika końcowego szczegółami? Twoja aplikacja może być monitorowana, abyś wiedział o niezaznaczonych wyjątkach, zanim użytkownicy je zgłoszą.
Nigdy nie można jeść wyjątków, nie jestem też fanem sprawdzonych wyjątków, ale wolę mieć plan odpowiedni dla charakteru całego produktu.
Głównym powodem zastosowania owijania wyjątków jest uniemożliwienie kodowi w warstwie biznesowej konieczności znajomości każdego możliwego wyjątku w systemie . Istnieją dwa główne powody:
Spójność: zadeklarowane wyjątki łączą się w górę stosu wywołań. Jeśli nie zawiniesz wyjątków, ale przekażesz je dalej, deklarując metody ich wyrzucenia, możesz skończyć z metodami najwyższego poziomu, które deklarują wiele różnych wyjątków. Deklarowanie wszystkich tych wyjątków w każdej metodzie w górę stosu wywołań staje się nużące.
Hermetyzacja: Możesz nie chcieć, aby komponenty najwyższego poziomu wiedziały coś o komponentach najniższego poziomu, ani o wyjątkach, które zgłaszają. Na przykład, interfejsy i implementacje DAO mają na celu wyodrębnienie szczegółów dostępu do danych z dala od reszty aplikacji. Teraz, jeśli twoje metody DAO rzucają wyjątki SQLException, kod używający DAO będzie musiał je złapać. Co się stanie, jeśli zmienisz się na implementację, która odczytuje dane z usługi internetowej zamiast z bazy danych? Następnie metody DAO będą musiały zgłaszać zarówno wyjątek zdalny, jak i wyjątek SQLException. A jeśli masz DAO, który odczytuje dane z pliku, musisz także zgłosić wyjątek IOException. To trzy różne wyjątki, każdy związany z własną implementacją DAO.
Krótko mówiąc, odpowiedź brzmi tak!
źródło