Philosophiefrage zu Exceptions und Rückgabewerten

Status
Nicht offen für weitere Antworten.

mwildam

Mitglied
Während ich mich so durchs weltweite Netz in Sachen Java lese finde ich immer wieder die Empfehlung, man soll doch mit Exceptions arbeiten, die man bis zu dem raufwirft, der was damit anfangen kann/will.

Im Gegensatz zu anderen Programmiersprachen, die keine derartige Fehlerbehandlung wie Try und Catch kannten/kennen, wird viel mit Return-Codes gearbeitet, die OK oder Fehler zurückliefern und wo der Erfolg vom Aufrufer durch Abfragen des Return-Codes geprüft werden kann (oder auch ignoriert werden kann).

Ich finde aber in den Core Java-Klassen auch durchaus Methoden, die mit Return-Codes arbeiten und nicht mit Exceptions, zB die Get-Methode einer Map. Die liefert null zurück, wenn ein Eintrag nicht existiert.

Da ich selbst ein wenig unsicher bin, wann ich mit Exception arbeiten sollte, wäre ich über einen Hinweis dankbar, der mir allgemein erläutert, wann es sinnvoll ist Exceptions zu verwenden und wann nicht.

Ganz am Anfang dachte ich mir, dass die Prüfung über Try-Catch eigentlich mühsam ist, dann war ich in einer Phase, da dachte ich, dass das eigentlich ein tolles Konzept ist und jede meiner Methoden in jeder unglücklichen Situation eine Exception werfen sollte, anstatt still und heimlich zu scheitern und einen Leerstring, 0 oder null zurückzuliefern.

Aber so beim Programmieren habe ich mittlerweile wieder das Gefühl, dass es nicht immer sinnvoll ist, Exceptions zu werfen. Ich habe außerdem mit einem Java-Entwickler gesprochen (in einem anderen Zusammenhang) wobei aus dem Gespräch hervorgegangen ist, dass seine Logfiles immer wieder voller Exceptions sind, die keinen interessieren. Ich will ja auch nicht unnötig Fehler produzieren.

Wie macht ihr das?
 

The_S

Top Contributor
Alles was wirklich ein Fehler ist (z. B. Divison durch 0, eine unerwartete null-Variable, ungültige Parameter, ...) wirft auch eine Exception. Wenn jetzt aber z. B. ein Key in einer Map nicht gefunden wird, dann ist das ja nicht wirklich ein Fehler, sondern es ist einfach nichts "da". Deshalb würde ich in solchen Fällen einfach den return-Wert (z. B. null) anpassen.
 

mwildam

Mitglied
Wie ist das zB bei einem ungültigen Datum?
Soll ich da null zurückgeben oder vielleicht sogar ein bißchen Selbstheilung versuchen und zB halt dann das aktuelle Datum setzen?

Oder wieder anderes Beispiel: Ich will den Text aus einer Datei lesen (eine ganz allgemeine Funktion, die ja in verschiedensten Programmen verwendet werden könnte). Wenn die zB nicht existiert, könnte ich eine Exception werfen oder ich liefere einfach null oder einen Leerstring zurück.

Eine Idee, die mir dazu noch kommt: Ich könnte ja eigentlich den Leerstring zurückliefern, aber auch Logeinträge schreiben, die nur ab einem gewissen "Genauigkeits"-Level den Weg ins Log finden. Ist das ein allgemein praktizierter Ansatz?

Warum ich so allgemein frage: Ich will ja natürlich meine Libraries so aufbauen, dass sich andere Leute beim Verwenden nicht dauernd an den Kopf greifen und mich verfluchen. Deshalb will ich mich möglichst an Java-Konventionen halten.
 

schalentier

Gesperrter Benutzer
Genaue Konventionen bzgl. Exceptions gibts soweit ich weiss nicht. Im Pragmatischen Programmierer gibts aber ein Kapitel genau darueber. Grundaussage ist, eine Exception ist wie der Name bereits suggeriert, eine Ausnahme. Also kein Fehler, der gewissermassen erwartet werden kann, sondern etwas was so nicht sein darf.

Um bei dem Beispiel mit Datei lesen zu bleiben: Wenn du eine Datei oeffnen willst, die der Benutzer auswaehlt, so ist es keine Ausnahme, wenn sie nicht existiert, sondern viel mehr eine Fehleingabe vom Benutzer. Dort sollte man also keine Exception werfen. Versuchst du jedoch eine Resourcendatei zu laden die existieren muss, sie es aber nicht tut - dann ist das eine Ausnahme und du kannst eine Exception werfen.

Im Hinterkopf solltest du dir behalten, dass "throw new XYException()" ein vergleichsweise teurer Aufruf ist, da die ganze VM angehalten werden muss, um den Stacktrace zu erstellen (klick).
 

mwildam

Mitglied
schalentier hat gesagt.:
Versuchst du jedoch eine Resourcendatei zu laden die existieren muss, sie es aber nicht tut - dann ist das eine Ausnahme und du kannst eine Exception werfen.
Da könnte ich aber eigentlich auch weiter oben (beim Aufrufer) eine Exception werfen beim Laden der Konfiguration, wenn ich eine "leere" Konfiguration bekommen habe, dh müsste nicht unbedingt ganz unten schon eine Exception werfen.

schalentier hat gesagt.:
Im Hinterkopf solltest du dir behalten, dass "throw new XYException()" ein vergleichsweise teurer Aufruf ist, da die ganze VM angehalten werden muss, um den Stacktrace zu erstellen (klick).
Das habe ich bisher nicht berücksichtigt. Dann ist auch klar, warum Map.get keine Exception wirft, denn ein Map.get wird wahrscheinlich oft in nicht heiklen Situationen einfach auch verwendet, um einen Eintrag zu finden, wenn er existiert und wenn nicht, wird er beispielsweise gesetzt. Da ist ein null natürlich in Summe wahrscheinlich oft ein gewaltiger Performance-Boost im Gegensatz zu einer Variante, die eine Exception wirft.

Vielen Dank!
 

schalentier

Gesperrter Benutzer
mwildam hat gesagt.:
schalentier hat gesagt.:
Versuchst du jedoch eine Resourcendatei zu laden die existieren muss, sie es aber nicht tut - dann ist das eine Ausnahme und du kannst eine Exception werfen.
Da könnte ich aber eigentlich auch weiter oben (beim Aufrufer) eine Exception werfen beim Laden der Konfiguration, wenn ich eine "leere" Konfiguration bekommen habe, dh müsste nicht unbedingt ganz unten schon eine Exception werfen.

Was ich meinte: Wenn du eine Datei laden willst, die es geben MUSS (z.B. logo.jpg) brauchst du prinzipiell gar nicht abfragen, ob die existiert und dann eine Exception werfen (oder null zurueckliefern) - sondern einfach zu oeffnen versuchen und die potentiell auftretende FileNotFoundException "nach oben werfen". Die Behandlung kannst du dann natuerlich irgendwo ganz oben im Call-Stack durchfuehren und z.b. das ganze Programm kontrolliert beenden.
 

Evolver

Bekanntes Mitglied
mwildam hat gesagt.:
Wie ist das zB bei einem ungültigen Datum?
Soll ich da null zurückgeben oder vielleicht sogar ein bißchen Selbstheilung versuchen und zB halt dann das aktuelle Datum setzen?

Das Thema ist zwar schon etwas älter, aber eine Anmerkung: Selbstheilung ist in einem Fall wie du ihn beschreibst eine sehr kritische Sache, die man nur in ganz wenigen Ausnahmefällen anwenden sollte. Denn dies führt zu schlecht wartbaren Code und zu extrem schwieriger Fehlersuche.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Test auf Exceptions schreiben Java Basics - Anfänger-Themen 11
berserkerdq2 Habe zwei exceptions, welche ist ein Kommunikationsfehler und welche ein Ausgabefehler? Java Basics - Anfänger-Themen 4
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
C Exceptions identifizieren Java Basics - Anfänger-Themen 5
A Exceptions mit objektreferenzen Java Basics - Anfänger-Themen 4
A Exceptions und methods Java Basics - Anfänger-Themen 2
A Cannot find symbol bei exceptions Java Basics - Anfänger-Themen 2
A Exceptions und Packages Java Basics - Anfänger-Themen 6
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
X Exceptions Benutzereingaben Java Basics - Anfänger-Themen 4
F Exceptions in Interfaces Java Basics - Anfänger-Themen 4
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
L Exceptions und Konten Java Basics - Anfänger-Themen 21
D Frage zu Exceptions Java Basics - Anfänger-Themen 8
G Wie programmiert man Exceptions? Java Basics - Anfänger-Themen 4
N Unterschied zwischen Checked und Unchecked Exceptions Java Basics - Anfänger-Themen 12
C Erste Schritte Exceptions nicht verstanden Java Basics - Anfänger-Themen 2
J Fragen zu Exceptions Java Basics - Anfänger-Themen 24
T Exceptions - ausgeführte Zeilen Java Basics - Anfänger-Themen 4
J Exceptions Java Basics - Anfänger-Themen 69
C Exceptions Java Basics - Anfänger-Themen 8
C Exceptions Java Basics - Anfänger-Themen 6
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
F Exceptions Java Basics - Anfänger-Themen 6
J Frage zum Thema Exceptions (Try/Catch) Java Basics - Anfänger-Themen 3
M "Exceptions abfragen" Java Basics - Anfänger-Themen 6
Farbenfroh Exceptions Anfänger - Finde Fehler nicht Java Basics - Anfänger-Themen 7
Z Catch & Exceptions Java Basics - Anfänger-Themen 4
N Compiler-Fehler Drei Exceptions in GUIHack für Dreiecke auf MoveButtons Java Basics - Anfänger-Themen 36
V Welche Exceptions müssen importiert werden? Java Basics - Anfänger-Themen 3
S Exceptions Java Basics - Anfänger-Themen 7
M Vererbung Problem Vererbung/Exceptions Java Basics - Anfänger-Themen 9
S Verschachtelte Exceptions - Übersicht verbessern Java Basics - Anfänger-Themen 2
J Eclipse Exceptions Java Basics - Anfänger-Themen 2
K Schleifen und Exceptions Java Basics - Anfänger-Themen 8
K Exceptions auslagern Java Basics - Anfänger-Themen 15
R NullPointer Exceptions Java Basics - Anfänger-Themen 3
F Erste Schritte Übung zu Exceptions Java Basics - Anfänger-Themen 24
R Exceptions (try/catch) Java Basics - Anfänger-Themen 63
H Int Exceptions Java Basics - Anfänger-Themen 12
M Exceptions per throws oder try Java Basics - Anfänger-Themen 4
M Compiler-Fehler Queue als ArrayList mit Exceptions Java Basics - Anfänger-Themen 3
T Exceptions in einer Klasse Java Basics - Anfänger-Themen 3
B Eigene Exceptions entwerfen Java Basics - Anfänger-Themen 3
H Methoden Überflüssige Exceptions Java Basics - Anfänger-Themen 20
C Exceptions Java Basics - Anfänger-Themen 14
1 While Schleife Exceptions Java Basics - Anfänger-Themen 6
I Erste Schritte Eigene Fehlermeldungen bei Exceptions Java Basics - Anfänger-Themen 19
D Frage zu Exceptions Java Basics - Anfänger-Themen 12
M Compiler-Fehler Exceptions lieber throwen oder direkt catchen? Java Basics - Anfänger-Themen 8
T Exceptions Java Basics - Anfänger-Themen 19
B Wie finde ich Exceptions? Java Basics - Anfänger-Themen 19
Dit_ Input/Output Alle Exceptions protokollieren Java Basics - Anfänger-Themen 9
T Exceptions Java Basics - Anfänger-Themen 12
J Standard Exceptions abfangen Java Basics - Anfänger-Themen 5
F Exceptions werfen oder catchen?? Java Basics - Anfänger-Themen 14
D Exceptions - Ausnahmebehandlung Java Basics - Anfänger-Themen 19
D Frage zu Exceptions und der import Anweisung Java Basics - Anfänger-Themen 12
J Paar Fragen zu Exceptions Java Basics - Anfänger-Themen 16
G Verständnisproblem: Exceptions Java Basics - Anfänger-Themen 17
S Exceptions bei push/pop in Stack Java Basics - Anfänger-Themen 8
C Exceptions beim Beenden Java Basics - Anfänger-Themen 2
C TimerTask und Exceptions Java Basics - Anfänger-Themen 5
E Klasse öffnen, mehrere Exceptions Java Basics - Anfänger-Themen 9
C Exceptions Java Basics - Anfänger-Themen 7
G 2 Exceptions in einer Methode Java Basics - Anfänger-Themen 3
firefexx Exceptions werfen Java Basics - Anfänger-Themen 5
0 Exceptions mehrfach fangbar? Java Basics - Anfänger-Themen 4
O Exceptions Java Basics - Anfänger-Themen 3
K Sinn eigener Exceptions Java Basics - Anfänger-Themen 11
H Diverse Exceptions - Troubleshooting Java Basics - Anfänger-Themen 3
J exceptions Java Basics - Anfänger-Themen 8
sc0p InterruptedExceptions und Exceptions - in Einem! Java Basics - Anfänger-Themen 5
M Frage zu Exceptions Java Basics - Anfänger-Themen 19
M Fragen zu Exceptions Java Basics - Anfänger-Themen 3
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
D Exceptions werfen + beenden Java Basics - Anfänger-Themen 12
M Exceptions aus interface-Methoden Java Basics - Anfänger-Themen 2
S File.renameTo und Exceptions / Fehlermeldung Java Basics - Anfänger-Themen 2
B Exceptions in Liste sammeln? Java Basics - Anfänger-Themen 5
O Eigene Exceptions Java Basics - Anfänger-Themen 11
O "restliche" Exceptions fangen Java Basics - Anfänger-Themen 8
H [Stil] Exceptions in der Klasse behandeln oder throwen? Java Basics - Anfänger-Themen 62
T Problem beim Werfen und Fangen von Exceptions Java Basics - Anfänger-Themen 2
V Aktivitätsdiagramm / Exceptions Java Basics - Anfänger-Themen 5
V Exceptions Java Basics - Anfänger-Themen 6
K Frage zu Exceptions -> Logging Java Basics - Anfänger-Themen 6
M Eigene Fehlermeldung bei Exceptions? Java Basics - Anfänger-Themen 12
R JDom Exceptions Java Basics - Anfänger-Themen 4
R Datei einlesen mit Exceptions Java Basics - Anfänger-Themen 2
Daniel_L Verwendung von try und catch bei exceptions Java Basics - Anfänger-Themen 7
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
G Exceptions - spiegeln wir da nicht einen Spiegel im Spiegel? Java Basics - Anfänger-Themen 10
G Verschiedene Exceptions zu gleichem Block Java Basics - Anfänger-Themen 6
U Frage zu Exceptions Java Basics - Anfänger-Themen 5
D Static, final Objekte mit Exceptions im Konstruktor Java Basics - Anfänger-Themen 2
G Exceptions Java Basics - Anfänger-Themen 4
G ServerSocket: Exceptions und Timeout Probleme Java Basics - Anfänger-Themen 10
M Exceptions bei Textfeldern abfangen Java Basics - Anfänger-Themen 2
P Problem mit exceptions Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben