Hallo!
Ja da scheiden sich vermutlich die Geister...
Also zunächst mal ist es so, dass eine Ausnahme zu 95 % immer eines bedeutet:
Abbruch der fachlichen Funktionalität.
...So so, und eine NoSuchItemException oder eine StockIsEmptyException ziehen keine weitere
fachliche Logik nach sich? (Ob das die 5% sind haengt von der Implementierung deiner Business Logic ab)
Die Frage ist wie reagiert man darauf. Allgemein ist es so ziemlich immer das gleiche...
Fehler irgendwo protokolieren (z.b. trace-Stack in ein log) Wenn es sich um eine anwendung mit GUI handelt Meldung and den User (z.B. mittels Pop-up-Dialog)
eventuell Daten in einen definierten konsistenten Zustand bringen (kommt meist bei DB-Anwendungen zum tragen und kann aus meiner Sicht als etwas spezielles angesehen werden).
Ob man das so Verallgemeinern kann...? Das obligatorische Logging des Fehlers macht ja in der Regel
durchaus Sinn, manchmal muss man jedoch auch andere Systeme ueber den Fehler informieren, Transaktionen
zurueckrollen, die Datenbankverbindung neu Aufbauen, Session Daten auf dem FileSystem persistieren etc.
Schon klar, dass solche Standardaktionen wie logging leicht zu zentralisieren sind, dass ist jedoch nur die
halbe Miete
Eine typische Problematik ist, wie oben schon erwähnt eine rollback für einen schreigenden DB-zugriff.
Aus meiner Erfahrung sollte man das rollback zusätzlich im catch-Block vor dem
MExceptionhandler.handelException(ex) aufrufen. mal ganz abgesehen von einem finally-block der die
Connection entweder schließt oder zurück in den Pool bringt.
Gibts bei der Arbeit mit JDBC nicht das ungeschriebene Gesetz, dass eine Connection die eine Exception
hervorgebracht hat direkt wegzuwerfen (zu schliessen) und NICHT wieder neu zu verwenden ist?
Nebenbei erwähnt die Thematik AOP (Aspekt-Orientiertes-Programmieren) wird furchtbar gerne für Logging und
Exceptionhandling angeführt. Aber das sind techniken, die aus meienr sicht eher noch in den Kinderschuhen
stecken und auch ziemlich gewöhnungsbedürftig sind. wenn ich AOP richtig verstehe übernimmt es mittels
einer Art-Precomplier das suchen und ersetzen im Sourcecode bezüglich immer wiederkehrender Aspekte wie
z.B. Logging und Exceptionhandling, aber dies ist sicher einer anderes Thema für einen neuen Thread
Na ja, ich wuerde sagen AOP steckt alles andere als noch in den Kinderschuhen (die Technik gibts uebringens
schon seit mehr als 6 Jahren...) AOP ist extrem nuetzlich und vereinfacht und beschleunigt die Entwicklung
von Software-System ungemein und hilft einige Unzulaenglichkeiten der OOP auszumerzen... Weiterhin ist fuer
AOP kein Precompiler notwendig. Dafuer gibts schon genuegend entsprechende Konzepte (Modifizierter Compiler
(CompileTime Weaving), Modifizierter ClassLoader (LoadTime Weaving), Dynamic Proxies (JDK Proxies, CGLib Proxies...)
(Runtime Weaving) etc.) Meine Meinung ist, dass Entwickler die heutzutage die Moeglichkeiten von AOP ignorieren oder
verniedlichen die Zeichen der Zeit noch nicht erkannt haben. AOP wird in Zukunft eine entscheidende Rolle bei der
Entwicklung von Software spielen (und tut es auch schon jetzt ;-).
Ich empfehle jedem Entwickler der halbwegs professionell rueberkommen will sich auf jeden Fall ernsthaft mit
AOP auseinander zu setzen.
...also an deiner Stelle wuerde ich mir AOP auf jeden Fall nochmal anschauen...
Es gibt Zahlreiche Frameworks (AspektJ, JBoss AOP, Spring AOP) mit denen sich AOP ganz einfach verwenden laesst.
Insbesondere das Springframework macht exzessiv Gebrauch von den schicken Moeglichkeiten von AOP.
(Und jetzt gehts erst richtig rund, nachdem der AspectJ Head Adrian Coyler von IBM zu Interface 21 gewechselt ist
@takidoso, ist natuerlich nicht boes gemeint
Gruss Tom