Soll die Serviceebene alle Dao-Ausnahmen erfassen und als Service-Ausnahmen einschließen?


23

Ich habe eine dreischichtige Spring-Web-App: Dao, Service und Controller. Ein Controller ruft niemals direkt das Dao an, sondern tut dies über die Service-Schicht. Derzeit wird eine Ausnahme (Laufzeit), die nicht behandelt wird, in den meisten Fällen von einer JSP abgefangen, die dem Endbenutzer eine Fehlermeldung anzeigt. Soll die Serviceebene alle Dao-Ausnahmen erfassen und als Service-Ausnahmen einschließen?

try {
   daoInstance.someDaoMethod();
} catch(DataAccessException dae) {
   throw new ServiceException("message", dae);
}

Nehmen wir an, ServiceException ist ebenfalls Laufzeit und wird auch nicht behandelt. Gibt es einen Unterschied, die DataAccessException anstelle der ServiceException auszulösen? Ich dachte nur, dass die Präsentationsschicht nicht über Datenzugriffsausnahme wissen sollte. Aber ich sehe keinen Sinn darin, nicht behebbare Ausnahmen einzufangen, nur um sie zu verpacken.

Antworten:


18

Ich denke, ein wichtiger Faktor ist, wer Ihre Service-Kunden sind.

Wenn Ihre Serviceebene nur eine architektonische Grenze zwischen den Ebenen in Ihrem eigenen Projekt ist und sich der Service-Client im selben Vertrauensbereich befindet, können Sie die Dinge lockern und ungeprüfte Ausnahmen auf die Controller-Ebene oder den Service-Client übertragen.

Für öffentlich zugängliche Codes; Service, der von einem Dritten oder Kunden in Anspruch genommen wird. Ich halte es für sauberer, ungeprüfte Ausnahmen mit einer serviceorientierten Ausnahme zu versehen, hauptsächlich aus Sicherheitsgründen, zweitens wegen lockerer Kopplung und sauberer Abstraktion.

Eine Datenschichtausnahme sollte niemals direkt zu einem Endbenutzer einer Webanwendung führen . Es enthält möglicherweise interne Informationen zu Ihrem Schema, Ihren Abfragen, Zeilennummern, Variablen- oder Funktionsnamen usw. Ausnahmen für Endbenutzer können in einer sicheren Einstellung bereinigt werden.

Ein externer Service-Client kümmert sich nicht um Ihre Implementierungsdetails und kann ohnehin keine ungeprüften Ausnahmen behandeln, da es sich um Fehler oder Umgebungsprobleme handelt. In sicheren Anwendungen sind Datenbankfehler einfach nicht sicher genug, um sich zu verbreiten. Dies OracleException - ORA-01234 - ...könnte die dritte Tabelle sein, die eingefügt wurde. Dem Client sollte erlaubt sein, alle überprüften / erwarteten Ausnahmen, die er behandeln kann, zu behandeln und alles andere als potenziellen Fehlerbericht zu behandeln. Ihr Servicevertrag sollte eine atomare, konsistente, transaktionale Abstraktion sein. Wenn die Ausnahme nicht behoben werden kann, bleibt nur ein Fehlerbericht. Sie haben bereits die Möglichkeit, die Ausnahme zu protokollieren. Warum sollten Sie Ihren Endbenutzer also mit den Details belasten? Ihre App kann überwacht werden, sodass Sie bereits über die nicht aktivierten Ausnahmen informiert sind, bevor die Benutzer sie melden.

Es ist nie in Ordnung, Ausnahmen zu essen , und ich bin auch kein Fan von geprüften Ausnahmen, aber ich bevorzuge einen Plan, der der Art des Gesamtprodukts entspricht.


13

Nein, Sie sollten DAO-Ausnahmen nicht in eine Webanwendung einbinden

Es ist eine Menge Lärm im Code, der keinen Nutzen bringt. DAO-Ausnahmen sind aus gutem Grund ungeprüfte Ausnahmen. Der Anwendungscode kann keine nützlichen Maßnahmen ergreifen, um eine DAO-Ausnahme zu beheben. Das eigentliche Problem ist hier:

... wird von einer JSP abgefangen, die dem Endbenutzer eine Fehlermeldung anzeigt.

Beheben Sie dieses Problem an einem Ort, anstatt die gesamte Codebasis zu verschrotten.

Sie steuern, wie dem Benutzer eine nicht erfasste Ausnahme angezeigt wird. Nicht erfasste Ausnahmen sind auf Anwendungsfehler oder einen Fehler im zugrunde liegenden System zurückzuführen. Es gibt keinen Grund, dem Benutzer Informationen darüber zu geben, warum seine Anfrage nicht bearbeitet werden konnte. Der Benutzer kann nichts tun. Alles, was Sie tun sollten, ist eine freundliche Fehlerseite zu bedienen.

NB: Wenn Sie häufig mühsamen Code schreiben, beispielsweise eine Reihe von catch-Blöcken erstellen, die einfach umbrochen und erneut geworfen werden, gibt es fast immer eine bessere Lösung.


Danke für deine Antwort. Und ja, der JSP zeigt eine benutzerdefinierte Meldung: "Ups, etwas ist schief gelaufen". Es werden keine Informationen zu der Ausnahme
Oscar

7

Der Hauptgrund für die Verwendung der Ausnahmebedingungsumhüllung besteht darin, zu verhindern, dass der Code in der Business-Schicht über jede mögliche Ausnahme im System informiert werden muss . Dafür gibt es zwei Hauptgründe:

  • Konsistenz: Die deklarierten Ausnahmen werden ganz oben im Aufrufstapel zusammengefasst. Wenn Sie keine Ausnahmen umbrechen, sondern sie weitergeben, indem Sie Ihre Methoden deklarieren, um sie auszulösen, erhalten Sie möglicherweise Methoden der obersten Ebene, die viele verschiedene Ausnahmen deklarieren. Das Deklarieren all dieser Ausnahmen in jeder Methode zum Sichern des Aufrufstapels wird mühsam.

  • Kapselung: Möglicherweise möchten Sie nicht, dass Ihre Komponenten der obersten Ebene etwas über die Komponenten der untersten Ebene oder die von ihnen ausgelösten Ausnahmen wissen. Der Zweck von DAO-Schnittstellen und -Implementierungen besteht beispielsweise darin, die Details des Datenzugriffs vom Rest der Anwendung wegzuziehen. Wenn Ihre DAO-Methoden SQLException auslösen, muss der Code, der die DAOs verwendet, diese abfangen. Was ist, wenn Sie zu einer Implementierung wechseln, die die Daten nicht aus einer Datenbank, sondern von einem Webdienst liest? Dann müssen Sie DAO-Methoden sowohl RemoteException als auch SQLException auslösen. Und wenn Sie ein DAO haben, das Daten aus einer Datei liest, müssen Sie auch IOException auslösen. Das sind drei verschiedene Ausnahmen, die jeweils an ihre eigene DAO-Implementierung gebunden sind.

Kurz gesagt lautet die Antwort ja!


3
JPA-Implementierungen (z. B. Hibernate) lösen ungeprüfte Ausnahmen aus. Sie müssen nicht deklariert oder gefangen werden.
Kevin Cline
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.