[Stil] Exceptions in der Klasse behandeln oder throwen?

Status
Nicht offen für weitere Antworten.

Hutmacher

Bekanntes Mitglied
Nehmen wir an, wir haben die Klasse VogelReader, mit der man Dateien des Typs .vogel auslesen kann. Diese Klasse besitzt einen konventionellen Konstruktor, dem man einen String als Pathname übergibt.
Sie wirft, sofern die Datei nicht gefunden wurde, eine IOException.
Jetzt ist die Frage: Wo soll die gecatcht werden?

Variante 1:
Java:
packe com.wayne.util;

import java.io.IOException;

public class VogelReader
{
    private String pathname;

    public VogelReader(String pathname)
     throws IOException
    {
        if ( doesNotExist(pathname) )
        {
            throw new IOException;
        }

        this.pathname = pathname;
    }

    //and-so-on-methods
}

//MainClass.java
public class MainClass
{
    public static void main(String[] args)
    {
        try
        {
            VogelReader vR = new VogelReader("gibbetsnich.vogel");
        }
        catch (IOException ioe)
        { 
            System.out.println("Die Datei existiert nicht!");
        }
    }
}
Hier wird in der Main-Methode gecatcht.
Vorteile:
Der Code ist flexibler. Die VogelReader-Klasse kann auch woanders noch verwendet werden. Es kann immer nach Bedürfnissen eine Fehlermeldung angepasst werden, oder sie kann direkt an die GUI weitergeleitet werden. Das wäre OOP, da Wiederverwendung.
Nachteile:
Der Code in der Main-Klasse (oder in anderen Klassen) hat immer einen try-catch-Block am Hals. Das stört mMn den Lesefluss erheblich, vor allem dann, wenn es mehrere Klassen gibt, die teilweise auch noch gleiche Exception werfen. Dann braucht man mehrere Blöcke.

Variante 2:
Java:
packe com.wayne.util;

import java.io.IOException;

public class VogelReader
{
    private String pathname;

    public VogelReader(String pathname)
    {
        if ( doesNotExist(pathname) )
        {
            System.out.println("Die Datei existiert nicht!");
        }
        else
        {
            this.pathname = pathname;
        }
    }

    //and-so-on-methods
}

//MainClass.java
public class MainClass
{
    public static void main(String[] args)
    {
        VogelReader vR = new VogelReader("gibbetnich.vogel");
    }
}
Hier wird in der Klasse itself direkt gecatcht.
Vorteile:
Der Main-Code ist klar lesbar und nicht von aufdränglichen try-catch-Blöcken zugeballert oder überhäuft. Wenn man diese Code liest, weiß man, dass man sich gar nicht mehr um das Catchen in irgendeiner Weise braucht, sondern dass es automatisch erfolgt. Das wäre OOP, da die Komplexität verringert wird, also Abstraktion.
Nachteile:
Die Wiederverwendbarkeit sinkt stark, da nun die Fehlermeldungen nicht mehr den entsprechenden Bedürfnissen angepasst werden oder in eine GUI-Ausgabe umgeleitet werden können.

Was denkt ihr darüber? Was ist besserer Codestil?
 
Zuletzt bearbeitet:

The_S

Top Contributor
Wenn ich also eigene Ausnahmeklassen schreibe, die ungeprüft sein sollen, dann muss ich die von RuntimeException ableiten.

ja

das wird eher nun zu einer allgemeinen "doku - design - Api" diskussion und entfernt sich n bisschen dem eigentlichen Thema ;-)

Kann sein, aber das will ich noch schnell loswerden ;)

d.h. du nutzt also fremde (wenn auch hausinterne) API ohne zu schauen / wissen was sie tut ?

Nein. Ein Beispiel: Wir haben ein Projekt. An diesem Projekt arbeiten x Mitarbeiter und stellen Ihren neusten Code in ein Repository (soweit so normal). Dort gibt es bspw. eine Methode, die an mehreren Stellen gerufen wird. Wenn ich persönlich diese Methode 2, 3 Mal gerufen habe, halte ich es nicht mehr für nötig, bei jedem weiteren Aufruf ein weiteres Mal nachzusehen, was die Methode denn genau macht. Ich/die IDE kennt die Parameter und ich weiß ja schließlich auch, was die Methode eigentlich macht/zurückliefert. Jetzt wird in der häufig gerufenen Methode bspw. ein kleiner Bug oder eine Möglichkeit der Performancesteigerung von einem anderen Entwickler gefunden. Hierdurch könnte aber unter Umständen eine Exception geworfen werden. Der Entwickler bessert die Methode und alle aufrufenden Methoden aus (was mit RuntimeExceptions schon mal aufwendiger ist) und stellt den neuen Code ins Repository. Beim nächsten Synchronisieren hole ich mir dann die Änderungen (nein, ich überprüfe nicht vor dem Synchronisieren jedes konfliktfreies Update ;) ), rufe meine altbekannte Methode wieder auf, und merke gar nicht, dass da jetzt auf einmal ein Fehler geworfen werden kann.
 
M

maki

Gast
Der Entwickler bessert die Methode und alle aufrufenden Methoden aus (was mit RuntimeExceptions schon mal aufwendiger ist) und stellt den neuen Code ins Repository.
Finde dass das Gegenteil der Fall ist, muss ja keine try/catch Blöcke basteln wenn ich gar keine brauche :)

Jedenfalls sind das Programmierfehler, diese sollten mit Tests abgefangen werden.
 

Sergeant_Pepper

Bekanntes Mitglied
Ja, wobei man eher selten eigene Exceptions schreiben sollte.
Ich schreibe gerade ein wrapper-Paket für einen Webservice-Client.
Da habe ich zwei eigene Ausnahmeklassen erstellt (abgeleitet von Exception). Dadurch vermeide ich, dass Anwendungen, die meinen wrapper verwenden, sich mit vielen einzelnen Exceptions herumschlagen müssen. Ich überlege nun gerade, ob ich die eigenen Ausnahmen von RuntimeException ableiten soll ... ???:L
 

tfa

Top Contributor
Ich schreibe gerade ein wrapper-Paket für einen Webservice-Client.
Da habe ich zwei eigene Ausnahmeklassen erstellt (abgeleitet von Exception). Dadurch vermeide ich, dass Anwendungen, die meinen wrapper verwenden, sich mit vielen einzelnen Exceptions herumschlagen müssen. Ich überlege nun gerade, ob ich die eigenen Ausnahmen von RuntimeException ableiten soll ... ???:L

Wenn dein Wrapper sowas wie ein wiederverwendbares Modul ist (also von unterschiedlichen Anwendungen verwendet werden soll), solltest du das auf jeden Fall tun.
 
M

maki

Gast
Aber irgendwo sollte ja zumindest auf den Fehler eingegangen werden.
Nicht auf alle imho, manche Exceptions sollten besser vermieden werden anstatt behandelt zu werden.

Was sind Programmierfehler (hab ja von ziemlich viel geredet)?
NPEs sind zB. meist folgen von Programmierfehlern, so wie IllegalArgumentExceptions, weil die Preconditions eben nicht erfüllt waren.
Anstatt ein try/catch auf NPE zu schreiben, sollte man sie nicht fangen und lieber den Code korrigieren wenn sie auftreten.

Ich schreibe gerade ein wrapper-Paket für einen Webservice-Client.
Da habe ich zwei eigene Ausnahmeklassen erstellt (abgeleitet von Exception). Dadurch vermeide ich, dass Anwendungen, die meinen wrapper verwenden, sich mit vielen einzelnen Exceptions herumschlagen müssen. Ich überlege nun gerade, ob ich die eigenen Ausnahmen von RuntimeException ableiten soll ... ???:L
Exceptions selbst ist sehr allgemein und im allgemeinen sollte auch keine java.lang.Exception gefangen werden, klar gibt es Ausnahmen in denen man sogar Throwable catched, sind aber spezielle Use Cases.
Wie gesagt, würde lieber von RuntimeException erben als von Exception, aber nur wenn ich wirklich meine eigenen Exceptions brauche.
 

Sergeant_Pepper

Bekanntes Mitglied
Wenn dein Wrapper sowas wie ein wiederverwendbares Modul ist (also von unterschiedlichen Anwendungen verwendet werden soll), solltest du das auf jeden Fall tun.
Ja, der Wrapper soll in JSP/Servlet-Anwendungen und auch in "Kommandozeilen"-Programmen (für Batchverarbeitungen über "cron jobs") genutzt werden. Ggf. auch in Swing- oder AWT-Programmen.
 

The_S

Top Contributor
Nicht auf alle imho, manche Exceptions sollten besser vermieden werden anstatt behandelt zu werden.

NPEs sind zB. meist folgen von Programmierfehlern, so wie IllegalArgumentExceptions, weil die Preconditions eben nicht erfüllt waren.
Anstatt ein try/catch auf NPE zu schreiben, sollte man sie nicht fangen und lieber den Code korrigieren wenn sie auftreten.

OK, da gebe ich dir natürlich recht (wenn auch nicht im Bezug auf unser spezielles Projekt, aber allgemein gesehen: Ja :D ). NPE, IllegalArgument, ... sind ja auch vollkommen zurecht RuntimeExceptions. Man sollte nur beim Werfen/Weiterleiten von Exceptions genau überlegen, ob jetzt eine RuntimeException angebracht ist oder eben nicht - und nicht generell sagen, dass alles außer RuntimeExceptions schlecht ist.
 
M

maki

Gast
Man sollte nur beim Werfen/Weiterleiten von Exceptions genau überlegen, ob jetzt eine RuntimeException angebracht ist oder eben nicht - und nicht generell sagen, dass alles außer RuntimeExceptions schlecht ist.
Genau das sage ich aber, ist auch nicht auf meinem Mist gewachsen, in Java ist schon lange ein Trend weg von checked Exceptions festzstellen und andere Sprachen haben sie komplett vermieden.
 

The_S

Top Contributor
Sind halt Meinungsdifferenzen. Ich denke die bekommen wir hier auch nicht gelöst (deshalb auch mein Hinweis in meinem ersten Post auf die nicht erwünschte Grundsatzdiskussion) und sollten das deshalb mal einfach so im Raum stehen lassen.

Schönes Wochenende!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Methoden Code Quality und Stil Java Basics - Anfänger-Themen 5
kaoZ Stil ? - ....Nein nicht das Ende des Besens ^^ Java Basics - Anfänger-Themen 11
M Vererbung Schlechter Stil? Java Basics - Anfänger-Themen 10
B Grundsätzliche Klassen-Struktur/Stil Java Basics - Anfänger-Themen 12
S Mein Code is unübersichtlich - besseren Stil Java Basics - Anfänger-Themen 6
S Unbeschaeftigten Thread in einer Schleife schlafen legen? Schlechter Stil? Java Basics - Anfänger-Themen 7
S Schlechter Stil beim Exception Handling Java Basics - Anfänger-Themen 6
J Getter und Setter auch intern benutzen - guter Stil? Java Basics - Anfänger-Themen 31
nabla Code Stil -- Eclipse Warnings Java Basics - Anfänger-Themen 9
P DotComVersenken -Spiel im Schiffeversenken-Stil - erstellen- Komm jetzt nicht weiter. Java Basics - Anfänger-Themen 11
P Spiel im Schiffe-Versenken Stil, Problem mit Erstellung des zweidimensionalen ARRAYs Java Basics - Anfänger-Themen 7
S sauberer Stil von return Wert (try, catch, finally) Java Basics - Anfänger-Themen 9
hdi Programmier-Stil : Speicher vs. Quellcode Java Basics - Anfänger-Themen 67
U Vernünftige Strukturierung, Guter Stil,. Java Basics - Anfänger-Themen 12
K BufferedReader im Konstruktor // guter Stil ? Java Basics - Anfänger-Themen 2
F Zugriff auf Instanzvariablen, Frage zum guten Stil Java Basics - Anfänger-Themen 2
J Guter Stil der Java-Programmierung Java Basics - Anfänger-Themen 5
G Array mit Schleife durchlaufen - guter Stil? Java Basics - Anfänger-Themen 20
frau-u guter Stil - wie macht mans am Besten? Java Basics - Anfänger-Themen 8
H schlechter objektorientierter stil Java Basics - Anfänger-Themen 6
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
I 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

Ähnliche Java Themen

Neue Themen


Oben