Obsługa wyjątków w aplikacji internetowej Java

Rozwijam średniej wielkości aplikację internetową Java z Struts jako Framework MVC i prostym JDBC w warstwie dostępu do danych. Szukałem najlepszych praktyk obsługi wyjątków w takiej aplikacji. Znalazłem kilka artykułów, niektóre z nich są sprzeczne, tylko czyni mnie bardziej zdezorientowanym, a nie czyni rzeczy jasnymi i prostymi. Niektórzy twierdzą, że lepiej jest ponownie wykorzystać istniejące wyjątki zamiast definiować wyjątki specyficzne dla aplikacji, inni prezentują ogromną hierarchię wyjątki specyficzne dla aplikacji dla każdego drobnego problemu, który może wystąpić w systemie. Niektórzy twierdzą, że lepiej nie obsługiwać WYJĄTKÓW na warstwie dostępu do danych i delegować je do warstwy usług, inni twierdzą, że wyjątki z warstwy dostępu do danych powinny być przechwytywane lokalnie, ponieważ delegowanie ich do warstwy usług naruszałoby abstrakcję między dwiema warstwami. I tak dalej.

Byłbym bardzo wdzięczny, gdybyś dał mi znać linki/nazwy do artykułów/książek, które prezentują solidne rozwiązania, które zadziałały dla Ciebie w takim scenariuszu. Rozwiązanie powinno wyjaśnić co najmniej następujące punkty z uzasadnieniem:

  1. gdzie można złapać SQLExceptions?
  2. Gdzie należy rejestrować wyjątki?
  3. czy niezaznaczone wyjątki powinny być rejestrowane?
  4. czy niezaznaczone wyjątki powinny być przechwytywane w warstwie prezentacji i powinny być pokazywane użytkownikowi?
  5. Jak postępować z zaznaczonymi wyjątkami, które z nich mają być pokazane użytkownikowi i w jaki sposób?
  6. Jak powinien być globalny wyjątek strona Obsługi być używane?
  7. Jak w tym kontekście należy stosować działania struts?

Thanks

Author: craftsman, 2010-01-30

3 answers

1: Gdzie można złapać SQLExceptions?

W klasach DAO w warstwie dostępu do danych. Możesz w razie potrzeby owinąć go niestandardowym wyjątkiem DAO. Ten wyjątek DAO z kolei musi być dalej obsługiwany jako wyjątek sprawdzony.

2: Gdzie należy rejestrować wyjątki?

W momencie, gdy masz zamiar throw je lub przejść przez framework wiadomości.

3: czy niezaznaczone wyjątki powinny być rejestrowane?

Powinny oczywiście być zalogowany. Powinny one mianowicie a nie występować w świecie rzeczywistym, ponieważ są oznaką błędu w logice kodu (tj. błędu programisty), który musi zostać jak najszybciej naprawiony. Należy je wrzucić aż do pojemnika i pozwolić pojemnikowi obsłużyć je za pomocą <error-page> w web.xml. Aby je zalogować (i ostatecznie wysłać), użyj Filter, która nasłuchuje na stronie błędu.

4: czy niezaznaczone wyjątki powinny być przechwytywane na warstwie prezentacji i czy powinny być pokazane do użytkownik?

Nie powinny wystąpić w ogóle.

5: Jak postępować z zaznaczonymi wyjątkami, które z nich mają być pokazane użytkownikowi i w jaki sposób?

Jeśli są wynikiem błędnego wprowadzenia użytkownika (np. brak numeru, zły e-mail, naruszenie ograniczeń itp.), pokaż je użytkownikowi w tej samej formie. W przeciwnym razie (np. DB down, Dao exception itd.) albo wrzuć go do strony błędu, albo wyświetl błąd z Komunikatem, aby spróbować ponownie później.

6: Jak czy należy używać globalnej strony obsługi wyjątków?

Przynajmniej w sposób przyjazny dla użytkownika. Tak więc, w tym samym układzie, z pewnym wprowadzającym "przepraszam" i w razie potrzeby z pewnymi szczegółami błędu i adresem e-mail, aby użytkownik mógł skontaktować się w tym przypadku.

7: W jaki sposób powinno się w tym kontekście używać struts ActionErrors?

Pokaż je użytkownikowi w tej samej formie.

 20
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-30 20:57:39

Jeśli nie możesz odzyskać wyjątku, powinieneś pozwolić mu wypłynąć z kodu(często przez odznaczenie lub zawinięcie go w niezaznaczony wyjątek). Jeśli pozostają sprawdzone, musisz je zaspokoić na każdym poziomie kodu, a co za tym idzie na każdej warstwie abstrakcji. SQLExceptions normalnie należą do tej kategorii(musisz je zawijać, ponieważ są zaznaczone).

Dla tych wyjątków Zwykle loguję się na najwyższym poziomie, ale prezentuję stronę użytkownikom po prostu szczegółowo, że coś poszło nie tak. Zwykle moi użytkownicy nie są zainteresowani śladami stosu. Ale zazwyczaj oferuję im stronę, aby mogli opisać, co robili w tym czasie, a zarejestrowany wyjątek łączy się z tym zgłoszeniem za pomocą unikalnego identyfikatora(zarejestrowanego w formularzu i w pliku dziennika z wyjątkiem). To pozwala mi powiązać działania użytkowników z wynikowym wyjątkiem.

Powyższe zakłada, że nie można odzyskać z SQLExceptions, a jeśli baza danych jest w dół, to nie mogę zrobić czegoś znaczącego. Są od tego oczywiście wyjątki. Może się okazać, że rozmawiasz z wieloma systemami, a jeden z nich nie oznacza, że nie możesz kontynuować w pewien sposób (np. Strona główna Amazon podobno opiera się na usługach 100 I musi działać niezależnie od niektórych z nich).

Spodziewałbym się, że zadeklarowane wyjątki będą na tym samym poziomie abstrakcji, co interfejsy/metody je definiujące. np. A TradeStore zostanie zadeklarowane jako throw a TradeException, nie SQLException (ponieważ metody przechowywania handlu są implementacją TradeStore - można przechowywać w relacyjnym db, JavaSpace itp.).

 4
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-30 21:46:02

Jako ostrzeżenie, podczas wyświetlania komunikatów o błędach niższego poziomu dla użytkowników, upewnij się, że są oczyszczone z informacji systemowych. Jest to obszar, w którym powstaje wiele wyczynów bezpieczeństwa. Zaloguj je z pełnymi informacjami, ale wyświetla tylko bardziej ogólny komunikat o błędzie dla użytkownika.

 1
Author: Nerdfest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-31 17:44:51