Exceptions als Fehlerbehandlung "missbrauchen"?

Status
Nicht offen für weitere Antworten.

Verjigorm

Top Contributor
Hallo,

wollte mal fragen wie ihr das handhabt:
Ich habe nen Codeblock welcher aus zahlreichen if/else besteht, die Werte prüfen und bei falschen Eingaben entsprechend eine Fehlermeldung ausgeben sollen.

Nun hatte ich in jedem else sowas stehen:
Code:
JOptionPane.showMessageDialog(...);
return;

hab aus dem else-zweig nun sowas gemacht:
Code:
throw new Exception("fehlermeldung xy");

und im catch-block dann:
Code:
JOptionPane.showMessageDialog(frame, e.getMessage());
return;

Macht für mich das Ganze etwas einfacher zu überschauen, bringt mir noch diverse andere Vorteile und finds auch generell sauberer.

Nun halt die Frage: Ist das legitim, try/catch derart zu "missbrauchen"?
Eigentlich sollten damit ja "schwerwiegenderer" Fehler behandelt werden.
Verwirrt sowas eventuell andere, die irgendwann mal mit dem Code arbeiten müssen?

mfg Verjigorm
 
M

maki

Gast
Exceptions zur Fehlerbehandlung sind eigentlich der vorgesehene Weg, mittlerweile gibt es aber auch Strömungen wieder mit Rückgabewerten zu arbeiten, da Exceptrionhandling schnell verwirrend werden kann.
 

kleiner_held

Top Contributor
Das ist in meinen Augen kein Missbrauch sondern ganz legitim.
Es ist aber besser nicht einfach die Klasse Exception zu werfen sondern eine eigene Klasse
Code:
ValidationException extends Exception
zu verwenden.
 

Verjigorm

Top Contributor
Klasse, 3 Antworten:
1 Ja
1 Nein
und 1 "zwischendrin" :D

;)

edit: das mit der eigenen Exception find ich irgendwie stylisch!
 
M

maki

Gast
Weiss nicht ob das hier passt Müder Joe, Bloch meint wenn man prüfen kann, ob eine Vorbedingung existiert, sollte man das auch mahcen (beim Iterator war das hasNext()) anstatt einfach mal einen try/catch Block drunherum zu machen.
 

Der Müde Joe

Top Contributor
Dachte dabei an den Controlfluss in der Methode:

Code:
doStuff() {
try{
if() {
//bla
} else if() {
throw new Exception();
} else {
//bla
} 
} catch(E.....) {}

in der Methode eine Exception schmeissen, dass man sie evtl fangen kann.
Tönt in meinen Ohren irgenwie böse.
 

kleiner_held

Top Contributor
Also erstmal, das direkte Rueckmelden der Fehler per JOptionPane waere mMn nach MVC Konzeption nicht gut, da ich annehme das das eine Model Klasse ist.

Bleibt also nur die Rueckmeldung von Validierungsfehlern.

Das geht halt entweder ueber eine spezielle checked Exception oder ueber einen return value. Return value hat den Vorteil, dass man auch mehrere Fehler sammeln kann.
Code:
public List<String> validate()
Ist die Liste leer dann ist alles i.O. ansonten hat man halt die Fehler.

Exception hat den Vorteil, dass man auch da sicherheitshalber noch einmal validieren kann, wo man den return value eigentlich anderweitig benoetigt, also ein Fall in dem ein Validierungsfehler eine echte Ausnahme ist:
Code:
public double calculate() throws ValidationException
Man kann natuerlich auch beide Konzepte mischen:
Code:
public List<String> validate() {
   [...]
}
public double calculate() throws ValidationException {
   List<String> validationResult = validate();
   if (!validationResult.isEmpty()) {
       throw new ValidationException(validationResult );
   }
   [...]
}
 

slawaweis

Bekanntes Mitglied
Verjigorm hat gesagt.:
Nun halt die Frage: Ist das legitim, try/catch derart zu "missbrauchen"?
Eigentlich sollten damit ja "schwerwiegenderer" Fehler behandelt werden.
Verwirrt sowas eventuell andere, die irgendwann mal mit dem Code arbeiten müssen?
alles was geht und man selber oder im Team versteht, kann man verwenden. Es gibt keine in Stein gemeißelten Regeln die besagen, dass man so eine Situation nicht so lösen darf. Manchmal ist es auch sinnvoll mit Exceptions zu arbeiten, denn diese können von Überwachungsprogrammen, wir z.B. Profilern, erfasst und anderweitig ausgewertet werden. Doch ich würde nicht dazu raten diese übermäßig einzusetzen, ich persönlich bin kein Freund der Exceptions. Diese sollten vor allem wirklich Ausnahmen darstellen, die nicht regelmäßig auftreten, wie z.B. nicht genug Speicher, fehlende Rechte seitens des OS, Netzwerkverbindungsabbruch weil jemand das Kabel gezogen hat. Weiterhin können schlecht oder "missbräuchlich" eingesetzte Exceptions schnell zu anderen Fehlern führen. Zum Beispiel wird diese Zeile:

Verjigorm hat gesagt.:
Code:
throw new Exception("fehlermeldung xy");

und das Abfangen dieser Exception alle anderen möglichen Exceptions überlagern. D.h. man geht davon aus, in diesem Block treten nur die eigenen Fehler auf, aber wenn jetzt eine Division durch 0 kommt oder ein ArrayIndexOutOfBoundsException, dann hat man plötzlich ein Problem, dass zu unterscheiden. Eine eigene Klasse für die Exception wäre also Pflicht. Doch auch dann tritt das Problem auf, dass man andere Exceptions, die vielleicht in höheren Schichten behandelt werden, in diesem Block kapselt und entweder ganz unterdrückt oder mühsam nach Oben durchschleifen muss.

In deinem konkretem Fall würde ich keine Exceptions empfehlen. Das ist ein klarer Fall für das Logging. Anstatt bei jeder Wertprüfung sofort eine Meldung auszugeben oder eine Exception zu werfen, empfehle ich nur mit if() alle möglichen Prüfungen durchzugehen und die "nicht bestandenen" Prüfungen sammeln, z.B. in einer Liste. Nachdem alle Prüfungen erledigt sind, wird die Liste ausgewertet, dem User entsprechend formatiert und in einer JOptionPane ausgeben. So kann man gleich alle möglichen Fehler dem User auf einmal zeigen und er muss sich nicht von Fehler zu Fehler kämpfen.

Slawa
 

Verjigorm

Top Contributor
Naja das Programm welches ich momentan bearbeite, ist nicht wirklich nach dem MVC-Prinzip aufgebaut, folgt eigentlich keinem erkennbarem Muster, nur Kraut und Rüben :(

Und die Idee mit der Liste von Fehlern:
Die Werte bauen aufeinander auf, wenn der "oberste" Wert falsch ist, sind alle folgenden auch falsch.

Eine andere Exception kann nicht auftreten, sind alles nur einfache Vergleiche und Additionen.

Die Eingabewerte können auch nicht falsch sein.

Die Methode mit der Exception bietet mir halt die Möglichkeit an einer zentralen Stelle Flags zu setzen, die für die Weiterverarbeitung hilfreich sind usw.

Ich hab das übrigends auf Java ist auch eine Insel aufgeschnappt:
http://www.galileodesign.de/openboo...08_003.htm#mj5a33d1a2fb38d8efe689a86438f29e2f
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
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
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
S Eclipse Apache Camel FTP: Fehlerbehandlung, wie? Allgemeine Java-Themen 2
G Wohin mit der Fehlerbehandlung? Allgemeine Java-Themen 6
L Reguläre Ausdrücke und Fehlerbehandlung Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben