Best Practice verschiedene Exceptions fangen und neue Exception erzeugen

Sergeant_Pepper

Bekanntes Mitglied
Hallo,

es gibt ja häufig die Situation, dass hiner einem try-Block 5 oder mehr catch-Blöcke folgen.

Mein Kollege und ich (beide Java-Quereinsteiger, keine Informatiker) überlegen und diskutieren nun, ob und wie wir diese Exceptions zusammenfassen, bzw. eine neue Exception erzeugen, weil die höhere Programmebene nur wissen muss, dass es ein Ausnahme gegeben hat.

Mein Kollege schlägt nun folgendes Prinzip vor:
Java:
try
{
    /* Anweisungen */
}
catch (FileNotFoundException ef)
{
       throw new Exception(
                   "Die Auftragsdatei wurde nicht gefunden:\n", ef);
}
catch (IOException ei)
{
       throw new Exception(
                 "Input/Output-Fehler beim Parsen der Auftragsdatei:\n",
                    ei);
}
catch (JDOMException ej)
{
       throw new Exception(
                 "Fehler (JDOM) beim Parsen der Auftragdatei:\n",
                 ej);
}
Einerseits finde ich den Gedanken richtig, mehrere Exceptions zu bündeln, um "oben" das Handling zu vereinfachen. Aber kann es sinnvoll sein, für die Vereinfachung die Basisklasse Exception zu verwenden?
 

Michael...

Top Contributor
weil die höhere Programmebene nur wissen muss, dass es ein Ausnahme gegeben hat.
Im Prinzip scheint es aber doch relevant zu sein, was für eine Exception aufgetreten ist!?

Irgendwie ist mir auch nicht klar welchen Vorteil das "Prinzip" bringen soll. Wenn die höhere Programmebene tatsächlich nur wissen muss, dass eine Exception aufgetreten ist, würde ja ein
Code:
throws Exception
an der Methode ausreichen.
 

Sergeant_Pepper

Bekanntes Mitglied
Das Programm soll in aller Regel nach der Ausnahme beendet werden. Über das Konstrukt
Code:
[EDIT]throw[/EDIT] new Exception("Beschreibung", nf)
können wir die auslösende Ausnahme als "Info", z.B. für das Logging, hinzufügen. Mit
Code:
throws
hinter der Signatur ginge das nicht.

Ich habe nur Zweifel, ob wir das mit
Code:
new Exception()
richtig machen, oder ob wir nicht eine eigene Exception-Klasse benutzen sollten.
 
Zuletzt bearbeitet:

D4rkscr43m

Bekanntes Mitglied
Wieso fangt ihr die Ausnahme denn überhaupt ab?

Einfach nur
Java:
public void meineMethode() throws Exception { /* hier dein Code der eine Ausnahme auslösen kann */ }
Würde doch reichen. Wenn eine Ausnahme ausgelöst wird, wird diese einfach an die aufrufende Methode weiter geleitet.
 

D4rkscr43m

Bekanntes Mitglied
Warum wir das möchten, habe ich meinem Posting von 16:05 Uhr beschrieben.

hast du nicht!

Du sagst, du möchtest das Programm nach einer Ausnahme beenden lassen.
Wieso sollte das nicht mit meinem Vorschlag gehen?

ALLE Ausnahmen SIND Exceptions, dass heißt, ob da nun eine FileNotFoundException, eine IOException oder einfach eine Exception fliegt, ist der Aufrufenden Methode egal, die Signatur sagt ihr, dass da eine Exception kommen kann und was für eine das ist, kann ja gerne gelogt werden, aber das kann der aufrufenden Methode weiterhin herzlich egal sein.
 

D4rkscr43m

Bekanntes Mitglied
Wenn es sich dabei nur um eine Abbruchbedingung handelt sind folgende Quelltexte gleichwertig:

Java:
public void dosomething() throws Exception {
try
{
    /* Anweisungen */
}
catch (FileNotFoundException ef)
{
       throw new Exception(
                   "Die Auftragsdatei wurde nicht gefunden:\n", ef);
}
catch (IOException ei)
{
       throw new Exception(
                 "Input/Output-Fehler beim Parsen der Auftragsdatei:\n",
                    ei);
}
catch (JDOMException ej)
{
       throw new Exception(
                 "Fehler (JDOM) beim Parsen der Auftragdatei:\n",
                 ej);
}
}

Java:
public void dosomething() throws Exception {
    /* Anweisungen */
}

Und selbst für das Logging reicht das aus, weil die Exception die geworfen wird ja immer noch eine FileNotFoundException, IOException oder JDOMException ist.
 

Sergeant_Pepper

Bekanntes Mitglied
Und selbst für das Logging reicht das aus, weil die Exception die geworfen wird ja immer noch eine FileNotFoundException, IOException oder JDOMException ist.

OK ... an diesen Aspekt hatte ich nicht gedacht. Danke!

Also könnte man das durchaus so machen, dass man spezialisierte Ausnahmen zur Klasse "Exception" umformt? Beim Google'n habe ich einige Stellen gefunden, wo davon abgeraten wird , konkrete Exception-Objekte zu erzeugen und zu fangen, z.B.
Best Practices for Exception Handling - O'Reilly Media und
10 best practices with Exceptions - WikiJava, exception, error, handling, throw, throwable
 

TKausL

Top Contributor
Also könnte man das durchaus so machen, dass man spezialisierte Ausnahmen zur Klasse "Exception" umformt?

Man formt sie nicht um.
Alle Exceptions leiten von "Exception" ab. D.h. es ist nur ein interner cast zur Vaterklasse.
Natürlich "solltest" du die Exceptions alle einzeln behandeln. Fals du aber sowieso bei ALLEN Exceptions gleich reagierst kannst du auch einfach alles gebündelt als catch(Exception e) behandeln.
 

newcron

Aktives Mitglied
VORSICHT:
"throws Exception" ist tatsächlich ein antipattern und *nicht* alle Exceptions sind gleich. Eine solche Aussage kostet einem Software Entwickler in einem Jobinterview definitiv die Chance auf einen neuen Arbeitsplatz.

Manche kann man behandeln, manche eben nicht. Bricht einem Webserver eine Datenbankverbindung weg, kann der vermutlich nicht so recht drauf reagieren, außer, internal server errors auszuspielen. Sollte ein nutzer in einer Desktop Anwendung allerdings eine Datei auswählen und hat stattdessen einen Ordner ausgewählt, kann man ihn vielleicht mit einem fehlerdialog darauf hinweisen.

Exceptions einfach blind weiterfliegen zu lassen, ist mitunter gefährlich, da man prinzipiell Fehlerursachen verschleiert und irgendwann nicht mehr weiß, welche Exceptions überhaupt fliegen könnten - es wirft ja alles einfach nur ne Exception.

Die modernere Vorgehensweise ist, Exceptions, die wirklich nicht behandelt werden können, in RuntimeExceptions zu wrappen. Die müssen weder gefangen noch deklariert werden und treten unter normalen umständen auch nicht auf. Wenn sie dann doch auftreten sollte man nur sicherstellen, dass sie einen Logeintrag oder einen Alarm triggern (vor allem, wenn es sich um eine Serveranwendung handelt). Generell gilt als gesichert, dass die Art, wie Java mit Exceptions umgeht nicht ganz optimal ist - bei vielen Exceptions die im JDK verwandt werden, würde eine RuntimeException völlig ausreichen. z.b.
[c]Charset.forName("utf-8");[/c] wirft gleich zwei checked exceptions, obwohl man in 99% der fällen eigentlich genau weiß, dass "utf-8" existiert und auch keine Exception werfen wird.

Um allerdings deine Frage zu beantworten:
ab Java 7 geht das:
Catching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking

Wenn du nur Java7 zur verfügung hast und wirklcih unterschiedliche exceptions fangen musst, würde ich dir hierzu raten:

Java:
try {
// ...
} catch(IOException e) {
    // behandle IO exceptions seperat, falls du sie tatsächlich auflösen kannst. 
} catch(Exception e) {
    throw new RuntimeException("error when trying to do complicated thing that should never ever go wrong", e); 
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Verschiedene Versionen mit Datenbanken Allgemeine Java-Themen 3
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
M verschiedene Dokumente auslesen Allgemeine Java-Themen 1
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
J Verschiedene Runtime Versionen gleichzeitig? Allgemeine Java-Themen 12
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
K Verschiedene Sprachen Allgemeine Java-Themen 1
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
M Verschiedene Pilzartenerkennung Allgemeine Java-Themen 0
I Verschiedene Arrays auslesen Allgemeine Java-Themen 6
nrg Verschiedene JREs im Browser konfigurieren Allgemeine Java-Themen 6
G DesignPattern Verschiedene Services Allgemeine Java-Themen 4
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
faetzminator verschiedene Beans, verschiedene Felder "koppeln" Allgemeine Java-Themen 3
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
M verschiedene Methonden innerhalb des gleichen Threads Allgemeine Java-Themen 7
N verschiedene Klasse laden (Designfrage) Allgemeine Java-Themen 2
S Package in verschiedene Projekten einbinden? Allgemeine Java-Themen 3
D Verschiedene Datein aus einer Zip Datei ins Programm laden Allgemeine Java-Themen 4
D Verschiedene Persistenz Strategien Allgemeine Java-Themen 7
S Konstruktoren, verschiedene Klassen, Methoden. Allgemeine Java-Themen 3
M Verschiedene Modi bei AbstractTableModel Allgemeine Java-Themen 10
J Verschiedene Klassen, verschiedene Ströme? Allgemeine Java-Themen 6
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
L Verschiedene Versionen eines Interfaces Allgemeine Java-Themen 12
J Verschiedene Starteinstellungen Allgemeine Java-Themen 7
J Programm für verschiedene Betriebssystem vertreiben? Allgemeine Java-Themen 10
M 2 verschiedene LookAndFeels in einem Fenster möglich? Allgemeine Java-Themen 6
D Gehts praktischer? Thema:Verschiedene Instanzen einer Klasse Allgemeine Java-Themen 3
C Verschiedene JDKs Allgemeine Java-Themen 6
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
C verschiedene Klassenarten Allgemeine Java-Themen 3
G Verschiedene Auflösungen Allgemeine Java-Themen 6
H verschiedene Java Versionen Allgemeine Java-Themen 3
A Textfeld soll verschiedene Datumseingaben akzeptieren Allgemeine Java-Themen 5
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
M Exceptions - wann / wie verwenden? Allgemeine Java-Themen 4
W Exceptions behandeln Allgemeine Java-Themen 16
Kirby.exe Exceptions erklärt Allgemeine Java-Themen 5
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
J Exceptions Allgemeine Java-Themen 1
Z Java Exceptions - Auf leeres Feld prüfen Allgemeine Java-Themen 10
E Exceptions abfangen und dann Programm stoppen - aber wie? Allgemeine Java-Themen 2
L Nullpointer Exceptions werden nicht angezeigt Allgemeine Java-Themen 5
V Exceptions Allgemeine Java-Themen 2
G Exceptions mit jre 7u40 Allgemeine Java-Themen 2
E LookAndFeel Exceptions bei UIManager.setLookAndFeel Allgemeine Java-Themen 4
W JavaDoc Runtime-Exceptions: Wie sinnvoll anzeigen? Allgemeine Java-Themen 14
C Threads und Exceptions Allgemeine Java-Themen 7
B Webstart Exceptions Allgemeine Java-Themen 7
R Threads Exceptions von Threads abfangen im ThreadPool Allgemeine Java-Themen 5
S Runtime Exceptions in eine Datei schreiben Allgemeine Java-Themen 7
G Internationalisierung von Exceptions Allgemeine Java-Themen 5
J JUnit - werfen von Exceptions testen Allgemeine Java-Themen 17
F Alle Exceptions abfangen Allgemeine Java-Themen 4
B Alle Exceptions auf einmal abfangen Allgemeine Java-Themen 4
G log4j - Behandlung nicht explizit abgefangener Exceptions Allgemeine Java-Themen 5
B Logging von Exceptions Allgemeine Java-Themen 7
G Designfrage: Exceptions in Konstruktoren Allgemeine Java-Themen 7
I Exceptions - weder catch- noch finally-Klausel funktioniert Allgemeine Java-Themen 12
M Verwendung von unchecked exceptions & bereits vorhandenen exceptions was priorisieren Allgemeine Java-Themen 3
hdi Verhalten bei nicht behandelten Exceptions Allgemeine Java-Themen 2
H Exceptions und IO Allgemeine Java-Themen 17
B Exceptions? Allgemeine Java-Themen 4
D Throws Exceptions Allgemeine Java-Themen 14
M Verständnisfrage Exceptions Allgemeine Java-Themen 2
V Exceptions als Fehlerbehandlung "missbrauchen"? Allgemeine Java-Themen 10
DEvent Wie behandelt man Exceptions in Iterator? Allgemeine Java-Themen 2
J Verständnisfrage zu exceptions Allgemeine Java-Themen 3
A Junit Exceptions testen Allgemeine Java-Themen 3
R Loading-Thread und Exceptions abfangen. Allgemeine Java-Themen 4
P Exceptions dokumentieren. Allgemeine Java-Themen 6
G Exceptions weiterwerfen Allgemeine Java-Themen 2
T Generics und Exceptions Allgemeine Java-Themen 6
P Exceptions throw Allgemeine Java-Themen 6
F Wann und wie Exceptions einsetzen? Allgemeine Java-Themen 13
J Method.invoke -> Exceptions der Funktion abfangen Allgemeine Java-Themen 5
T Frage zu Exceptions Allgemeine Java-Themen 3
G Java-Exceptions werden nicht ganz angezeigt. Wo ändern? Allgemeine Java-Themen 3
J Probleme mit Exceptions Allgemeine Java-Themen 11
R Exceptions mit aktuellen Programminformationen ausgeben? Allgemeine Java-Themen 2
märliprinz com.sap.dbtech.jdbc.exceptions.JDBCDriverException Allgemeine Java-Themen 2
G Alle Exceptions loggen Allgemeine Java-Themen 4
G Frage zu Exceptions Allgemeine Java-Themen 6
M err oder alle Exceptions eines Programms abfangen Allgemeine Java-Themen 4
G Exceptions ohne Zeilennummer (Unknown Source) Allgemeine Java-Themen 8
T Exceptions im statischem Klassencode Allgemeine Java-Themen 5
B JAX - RS und ConstraintViolationException fangen? Allgemeine Java-Themen 21
D KeyEvents immer fangen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben