Programmierstil: Exceptions?

DarthShader

Erfahrenes Mitglied
Hallo,

ich habe keine konkrete Programmierfrage zu einem Code, sondern eher eine relativ allgemeine Frage zum Programmierstil:

Es geht um Exceptions. Diese werden in Java ja sehr stark/oft eingesetzt. Wenn ich nun ein eigenes Projekt aufbaue, und ich habe in verschiedenen Klasse Methoden, die entweder "gelingen" oder "nicht gelingen", ist es dann ratsam, das Nichtgelingen ebenfalls durch eigene Exceptions zu signalisieren?

Nehmen wir an, ich schreibe einen Parser für eine Textdatei. Ist die Textdatei nun fehlerhaft, der Parser kann mit dem Inhalt nichts anfangen, so könnte die Methode des Parsers ja eine Art von "ParsingException" werfen. Oder man gibt der parser Methode den Rückgabetyp "boolean", sodass ein Rückgegebener "false" Wert das nicht erfolgreiche Parsen signalisiert.

Ich tendiere hier dazu, Exceptions zu benutzen, da man dort auch weitere Informationen kapseln kann. Allerdings, ist das der sinn von Exceptions? Es sind ja Ausnahmen, und sollte man diese nicht für unerwartete Fehler einsetzen? In meinem Parser Fall könnte ich ja sehr gut erwarten, dass die Datei fehlerhaft ist...

Ich hoffe mir kann da jemand weiterhelfen. Insbesondere hoffe ich, dass der Weg über Exceptions in Java so Gang und Gebe ist, obwohl ich momentan noch eher ein schlechtes Gewissen dabei kriege, so viele Exceptions zu definieren.

Danke!
 
Also ich würde Exceptions auf keinen Fall zur Steuerung des "normalen Programmflusses" einsetzten.

Bei deinem Beispiel würde ich im Normalfall sagen, dass eine Exception dann gerechtfertigt ist, wenn dein Programm den Inhalt der Textdatei benötigt, bzw. sich eigentlich darauf verlassen können sollte, dass die Datei in einem bestimmten Format vorliegt (zum beispiel bei einer Programm Config).
Hast du ein Programm, das zum Beispiel ein Verzeichnis nach (für das Programm) lesbaren Dateien durchforstet, dann würde ich zuerst eine Methode implementieren, die sicherstellt, dass die Datei lesbar ist. Die gibt dann einen Boolean zurück.

Ansonsten versuche ich mich in Java daran zu halten:
Unchecked Exceptions: Alle Fehler, die der Programmier durch umsichtiges Programmieren abfangen könnte. (Zum beispiel lesen aus einer leeren Liste)
Checked Exceptions: Alle Fehler, die durch "höhere Gewallt" entstehen, und nicht (so einfach) im Vorfeld geprüft werden können. (Zum Beispiel eine IOException, weil ein Stream plötzlich dicht ist, oder was in der Art)

Wobei es dabei auch wieder einige Grauzonen gibt.

Grüße
Daniel
 
Hallo,

Checked Exceptions (von java.lang.Exception abgeleitet) -> Müssen gefangen werden ->
try{ ... } catch (...) bzw. throws xxxx erforderlich. Wird vom Compiler verlangt.
Checked Exceptions bei Ausnahmen die zu Erwarten sind und die der API Benutzer behandeln kann, bzw. darauf hin noch
etwas sinnvolles tun kann. (Mehr als catch & log ... beispielsweise irgendwelche retry Logik, anderer Server, anderes Format)

Unchecked Exceptions (von java.lang.RuntimeException abgeleitet) -> Müssen nicht gefangen/deklariert
werden (man wird nicht vom Compiler dazu gezwungen, aber man kann es natürlich dennoch tun).
Unchecked Exceptions bei Ausnahmen bei denen kein Sinnvolles behandeln möglich ist.
(Anwendungsfall / Datenbankverbindung bzw. die ganze Anwendung wird dann neu gestartet).
Typische Kandidaten für UncheckedExceptions wären beispielsweise Exceptions die von der Datenbank geworfen werden.
Wenn die DB heruntergefahren wird kann der normale User in der Regel nichts mehr vernünftiges machen...
("Leider sind in der aktuellen Java API die SQLException checked Exceptions so das man gezwungen ist auch diese zu behandeln...)
(Seit Java 6 gibts übrigens eine etwas schönere weil feinkörnigere SQLExceptionHierarchy -> SQLTransientException, SQLNonTransientException, SQLRecoverableException)
Ansonsten gibt es in machen Java Frameworks wie Beispielsweise dem Springframework etwas Verwendungsfreundlichere
ExceptionHierarchien im Umgang mit Datenbanken -> http://static.springframework.org/s.../springframework/dao/DataAccessException.html
Unchecked Exceptions sehe ich eher im zugrundeliegenden Framework besser aufgehoben als im Anwendungscode.

Natürlich kann man auch auf manche Unchecked Exceptions noch entsprechend reagieren (entweder mit einem expliziten try{...} catch(...) )
oder per entsprechendem UncaughtExceptionHandler am Thread:
http://www.tutorials.de/forum/java/239670-exceptions-im-thread.html

Gruß Tom
 
Vielen Dank für Eure ausführlichen Antworten. Ich denke das hat mir schon sehr weitergeholfen, bzw. es hat mich in meinem Programmierstil bestätigt.
 

Neue Beiträge

Zurück