Stilistisch korrektes Exception Handling

nrg

Top Contributor
Hallo Zusammen,

ich habe eine abstrakte Properties Klasse und einen Logger (enthalten nur statische Methoden). Diese werden am Anfang initialisiert und können somit von jeder anderen Klasse aufgerufen werden. Damit gibt es auch überhaupt keine Probleme. Mein Problem bzw meine Frage ist eher von stilistischer Herkunft.

Um eine "lockere Kupplung" der Klassen zu gewährleisten sollte ich eigentlich in keiner Klasse die beiden Klassen direkt verwenden. Bei den Properties ist das recht einfach, indem man alles als Parameter übergibt und dann in der aufrufenden Klasse die Daten von der Properties Klasse holt.

Beim Loggen ist mir das nicht so ganz klar. Mögliche Fehler, die ich selbst abprüfe kann ich natürlich ganz einfach werfen. Z.b. in der Klasse Properties die Methode checkProperties() throws IllegalPropetyException. Dort kann ich dann jeden throw einen spezifischen String mitgeben
Java:
if ( bedingung für eine falsche Property )
   throw new IllegalPropetyException( XXX hat einen falschen Wert XXX );

Allerdings Fehler die sporadisch auftreten (Fehler, wo es nahezu unmöglich/sehr umständlich ist alle "Benutzerfails" abzudecken) möchte ich nicht einfach so weiterschmeissen sondern ihnen natürlich auch individuelle Fehlermeldungen mitgeben.

z.B. eine ArrayIndexOutOfBounds behandle ich derzeit so:
Java:
try {
evtl AIOOB
} catch ( aioob.... ) {
meinLogger.fatal( "meine individuelle meldung" );
}

das gewährleistet natürlich keine "lockere Kupplung" meinee Klassen...

Laaaange Rede kurzer Sinn ;):

ist es schlechter Stil, wenn ich es so machen:
Java:
try {
evtl AIOOB
} catch ( aioob.... ) {
throw new( "meine individuelle meldung" );
}

somit ist mein Logger zentral nur in der aufrufenden Klasse. Allerdings brauch ich einen try/catch mehr :(. deshalb dachte ich mir, dass ich vllt irgendwas nicht berücksichtigt habe und es stilistisch schönere Optionen gibt.

Danke schonmal
 

musiKk

Top Contributor
Verschiedene Punkte:

Es sieht so aus, als ob Du Deine eigene Logger-Klasse erstellt hast. Ich würde dazu raten, einen bestehenden Logging-Mechanismus wie java.util.logging oder log4j zu verwenden.

Ich weiß jetzt nicht, ob alle Deine Anwendungsfälle wie das Beispiel sind. Eine ArrayIndexOutOfBoundsException ist jedenfalls kein "Benutzerfail", sondern ein "Programmierfail" - ähnlich wie die meisten anderen RuntimeExceptions, die es in der Java-API gibt. So etwas darf einfach nicht auftreten; dazu gibt es [c]length[/c]. (Kommst Du vielleicht von Python? Da macht man das wohl so...)

Wenn bestimmter Code etwas macht und es ist würdig, geloggt zu werden (ob nun Fehler oder nicht), dann sollte das auch passieren. Logging ist eine sehr gebräuchliche und legitime Abhängigkeit. Es wirkt auf mich, als ob Du Logging nur in der main() durchführst und das ist definitiv nicht nötig und auch nicht immer möglich. Da weiß man ja auch nicht mehr, als mit einem Stacktrace. Ansonsten kann man durchaus sowas machen wie Fangen, Loggen, Weiterwerfen oder vor dem Werfen auch wieder in eine neue Exception verpacken (z. B. checked Exceptions in RuntimeExceptions stecken o. ä.).

Ich nehme auch mal an, das letzte Codebeispiel soll eher sowas enthalten wie [c]throw new ProgrammerMistakeException("meine individuelle meldung")[/c] ;) [c]new("...")[/c] geht natürlich nicht.
 

nrg

Top Contributor
ich benutze log4j. Weil das Programm aber einmal im systray und einmal als task ausgeführt werden kann, kann es gut sein, dass eine Console nicht vorhanden ist bzw für Fatale Fehler ein MessageDialog erscheinen soll. Somit hab ich eine statische Klasse, die das l4j-LoggerObjekt enthält und zb auch eine Methode fatal, die die logger.fatal aufruft und falls das Prog im systray läuft einen MessageDialog anzeigt. Die Appender sind natürlich auch davon abhängig.

Ich weiß jetzt nicht, ob alle Deine Anwendungsfälle wie das Beispiel sind. Eine ArrayIndexOutOfBoundsException ist jedenfalls kein "Benutzerfail", sondern ein "Programmierfail" - ähnlich wie die meisten anderen RuntimeExceptions, die es in der Java-API gibt. So etwas darf einfach nicht auftreten; dazu gibt es [c]length[/c]. (Kommst Du vielleicht von Python? Da macht man das wohl so...)

und wenn ich Befehle aus den Properties lese, die z.b. so ausehen:

FIELD1 = sql~SELECT*FROM table WHERE ID='%3%'

da wird in Feld1 der Ausgabedatei das Ergebnis des Statements geschrieben. %3% steht für das Feld3 in der Eingabedatei. Wenn der Benutzer jetzt ein FIELD angibt, dass er in der Ausgabedatei garnicht vorgesehn hat. Also z.b. FIELD10 = (gibt noch einen Parameter für die größe der Ausgabedatei -> ausgabeArray) dann wird das wohl knallen. Andersrum wenn er eine %VAR% angibt, die nicht in der Eingabedatei exisiert. (ist bissle konfus das jetzt auf die Schnelle zu erklären aber denke das ist schon verständlich). Natürlich könnte ich diesen einen Fall abprüfen aber das war mir zu unsicher. Deshalb catch ich lieber die AIOOB...

edit: ja gut, bei aioob hast du recht. das sollte ich wohl besser abprüfen und dann kann ich ja eine IllegalArgumentException schmeissen. Dann wären noch zb FileNotFoundExceptions oder NumberFormatExceptions offen, die ich natürlich nicht schmeissen will, weil ich die Lokalen informationen mitloggen will. Natürlich - wie schon gesagt - kann ichs lokal loggen. aber ich würde gerne die Koppelung so gering wie möglich halten...
 
Zuletzt bearbeitet:

nrg

Top Contributor
also um vllt meine Frage nochmal expliziter in die Runde zu stellen (jetzt mal abgesehn von der AIOOB. Da hat musiKk recht. die sollte ich durch meine Programmlogik ausschließen - war ein blödes Beispiel)

- Soll ich Exceptions (z.B. FileNotFound IO NumberFormat SQL) lokal behandeln und sofort loggen (dh meine Klassen benötigen immer einen initialisierten Logger in meiner abstrakten Loggerklasse (was ich irgendwie blöd finde)
- Soll ich die Exceptions einfach werfen und in meiner aufrufenden Klasse behandeln. Somit kann ich allerdings keine genaueren Informationen loggen, was mir auch nicht gefällt
- Soll ich die Exception lokal catchen, im catch wieder mit der genauen Fehlermeldung werfen und in der aufrufenden Klasse behandeln. Somit besteht keine Koppelung und ich hab trotzdem alle Infos geloggt, die ich haben will. Für mich bis jetzt die schönste Option. Allerdings mehr Code... (frag mich halt, ob das nicht stilistisches total unschön ist)
 

musiKk

Top Contributor
Wie gesagt: Einen Logger als Abhängigkeit zu haben ist OK. Man kann prinzipiell loggen, wo man will (und es sinnvoll ist). Es ist schwierig, Pauschalaussagen zu treffen.
Wenn Dein Programm oder Deine Bibliothek einen Logger verwendet, dann ist es ja auch egal, wo. Die Abhängigkeit ist insgesamt da oder nicht. Von daher finde ich es auch schwer, die Aussage "der aufgerufene Code wirft Exceptions und der aufrufende Code soll loggen" einzuordnen. Damit ist die Abhängigkeit ja bereits da.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Object cast exception Allgemeine Java-Themen 7
W Queue.remove() -> no such element exception Allgemeine Java-Themen 17
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
N Kann ich die Nullpointer Exception umgehen Allgemeine Java-Themen 12
N A java Exception has occured Allgemeine Java-Themen 8
G javafx "class path" exception Allgemeine Java-Themen 5
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
tom.j85 Exception bei Abfrage von Ländercodes in API? Allgemeine Java-Themen 13
S Exception Allgemeine Java-Themen 5
LimDul Streams und Exception Allgemeine Java-Themen 8
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
S Wertbeschränkung Exception oder Anpassung? Allgemeine Java-Themen 4
D Nullpointer Exception Problem Allgemeine Java-Themen 5
Kirby.exe Nullpointer Exception bei Queue Allgemeine Java-Themen 5
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S RMI Exception Allgemeine Java-Themen 0
S MSSQL Exception & Connection String Allgemeine Java-Themen 19
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
coolian warum bekomme ich ein string index out of bounds exception Allgemeine Java-Themen 17
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
M Klassen Serializable Exception Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
B Exception in Application init method Allgemeine Java-Themen 5
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
M javafx ComboBox- Nullpointer Exception Allgemeine Java-Themen 6
perlenfischer1984 Dialect class not found exception Allgemeine Java-Themen 15
Thallius Bekomme keine Exception mit Stacktrace mehr. Was habe ich getan? Allgemeine Java-Themen 13
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
0 Animiertes Gif anzeigen - NullPointer Exception Allgemeine Java-Themen 19
T Konstruktor löst exception aus Allgemeine Java-Themen 7
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
D Codeausführung bevor Exception abgeschlossen ist Allgemeine Java-Themen 11
T FileNotFound Exception Allgemeine Java-Themen 9
L Exception/Error auf JDialog umleiten Allgemeine Java-Themen 2
C Arithmetic Exception, obwohl nichts 0 ist Allgemeine Java-Themen 5
M A Java Exception has occured. Allgemeine Java-Themen 1
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
E A Java Exception Has Occured Allgemeine Java-Themen 4
T Exception handling Allgemeine Java-Themen 7
P lazy loading exception Allgemeine Java-Themen 0
A Interpreter-Fehler OutOfMemory Exception mit Base64 decode Allgemeine Java-Themen 3
S Java Applet Crash - Keine Exception Allgemeine Java-Themen 8
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P Eigene Exception Klasse Allgemeine Java-Themen 7
N Java Interne Exception Allgemeine Java-Themen 4
B JUnit4 Exception-Test Allgemeine Java-Themen 4
127.0.0.1 SQL Exception, kein Driver Allgemeine Java-Themen 9
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
Ollek Barcode mit Barcode4J erzeugen - Exception Allgemeine Java-Themen 4
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
T Exception versus Rückgabeparamter Allgemeine Java-Themen 26
S Exception enableDepthTest Allgemeine Java-Themen 7
M JAXB Reimport zu Hibernate DB -> Exception Allgemeine Java-Themen 3
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
N Runtime.exec() Exception Problem Allgemeine Java-Themen 3
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
E Interpreter-Fehler unbekannte Exception Allgemeine Java-Themen 12
B Komische Exception Allgemeine Java-Themen 4
U SwingWorker und Exception Allgemeine Java-Themen 3
B Nullpointer Exception in Array Allgemeine Java-Themen 15
G WebService Exception Allgemeine Java-Themen 3
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
G PermSpace Exception Allgemeine Java-Themen 2
S Invalid Chunk Exception Allgemeine Java-Themen 3
N URLClassLoader Exception Allgemeine Java-Themen 5
Apo Java Sound Mark/Reset Exception Allgemeine Java-Themen 14
M Exception ganz sehen Allgemeine Java-Themen 2
D Problem mit EasyMock und Exception Allgemeine Java-Themen 6
B Exception wird geworfen, ich darf sie aber nicht abfangen. Allgemeine Java-Themen 10
7 Exception wird nicht aufgefangen Allgemeine Java-Themen 8
C Desktop.mail Problem. IO Exception: Failed to open. Allgemeine Java-Themen 3
L [Exception] RSA Verschlüsselung. Allgemeine Java-Themen 16
Final_Striker Exception bei neuem Look und Feel Allgemeine Java-Themen 2
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5
F Geworfene Exception kommt nicht an Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben