Frage zu Exceptions

  • Themenstarter Themenstarter Diac
  • Beginndatum Beginndatum
D

Diac

Gast
Hallo,

Habe eine kleine Frage zu Exceptions, die ein Thema sind in einem Buch.

Sind Exceptions, klar definierte, Ausnahmefehler? Also wenn im Buch selbst erfundene Exceptions, wie [c]tshirtException[/c] erklärt werden, dann wahrscheinlich nur zum Verständnis?

Bei der erfundenen Exception gehts um Polymorphie, denke dies wäre auch nicht kompilierbar.

Danke
R.
 
Das werfen von Exceptions ist in Java der Weg, den Aufrufer über das Auftreten eines Fehlers zu informieren. Es ist durchaus erlaubt und auch gängige Praxis, eigene Exceptions zu definieren, wenn keine bereits definierte Exception passt. Diese müssen, damit sie geworfen werden können, von Throwable oder einer seiner Subklassen erben. Mit Polymorphie hat das nichts zu tun.
 
Hallo,

Danke für die Antwort, ist jetzt klarer, wieso das man selbstdefinierte Exception deklarieren kann.
Also Throwable([c]in demfall mit dem Schlüsselwort "throws"[/c]), wird die superklasse sein, daher kann man sich im Vererbungsbaum bewegen.
Polymorphie wäre wenn etwas überschrieben wird, könnte aber auch mit Vererbung zu tun haben.

Fraglich ist noch wie man diese Ausnahmefehler einschätzen könnte, oder probiert man einfach das kompilieren?

Gruss
R.
 
Throwable ist die Superklasse aller Exceptions entweder direkt oder über mehrere Stufen.
Polymorphie wäre wenn etwas überschrieben wird,
Stimmt. Beim Ableiten von Exceptions überschreibt man deren Methoden aber eher selten. Man implementiert eher neue.
könnte aber auch mit Vererbung zu tun haben.
Das hat definitiv was mit Vererbung zu tun.
Fraglich ist noch wie man diese Ausnahmefehler einschätzen könnte, oder probiert man einfach das kompilieren?
Die Frage verstehe ich nicht. Exceptions zeigen nicht an, dass der Code an sich fehlerhaft ist sondern, dass in einem laufenden Programm ein Fehler aufgetreten ist. Damit ein Programm laufen kann, muss es natürlich vorher kompiliert worden sein.
 
Schau mal bei uns ins FAQ, wir haben hier einen schönen Beitrag zu Exceptions. Mir ist auch nicht ganz klar, was du mit deinem letzten Satz meinst. Vllt kennst du den Unterschied zwischen Checked und Unchecked Exceptions nicht. Das ganze wird aber in dem geposteten Link erklärt.
 
Hallo,

Es ist verständlicher jetzt, vielen Dank. Werde auch den Link durchlesen. Bin gerade beim Thema Exceptions im Buch, aber es gab einige Fragen.

Also mit dem überschreiben von Methoden, meinst du die Methoden die die Ausnahmesituation auslösen? Könnte man auch das zuweisen einer Referenz meinen, z.B HemdException wird KleidungsException zugewiesen?

Der untere Satz ist nicht klar formuliert, damit meinte ich, dass man bei definierten Exceptions, sieht was sie ausgelöst hat. Aber wenn man selbstdefinierte Exceptions benutzt, welche Ausnahmen benutzt man da, wenn es schon definierte gibt? Könnte mir jemand ein kleines Codebeispiel geben und den Fehler erklären?
Unchecked müssten alle RuntimeExceptions sein, was vielleicht nicht das gleiche wie selbstdefinierte Exception sind.



Fraglich ist noch wie man diese Ausnahmefehler einschätzen könnte, oder probiert man einfach das kompilieren?


Gruss
R.
 
Checked Exceptions sind Unterklassen von Exception. Wenn du eine Methode so deklarierst, dass sie eine checked Exception wirft, dann zwingst Du den Aufrufer Deines Codes zu einem try-catch Block oder dazu, die Exception weiter zu werfen. Unchecked Exceptions sind Unterklassen von RuntimeException. Damit zwingst Du den Aufrufer zu nichts.

Checked Exceptions werden zur Anzeige von Fehlerzuständen benutzt, auf die "irgendwie sinnvoll" reagiert werden kann. Unchecked Exceptions werden benutzt, um einem Programmierer anzuzeigen, dass er einen Fehler gemacht hat. Ich tendiere inzwischen eher dazu, immer unchecked Exceptioins zu werfen.

Man sieht bei beiden am StackTrace, wo sie ausgelöst wurden. Was genau der Fehler war, kann manchmal etwas undeutlich sein, wenn sich der Programmierer nicht genug Mühe bei der Auswahl der richtigen Exception und/oder Generierung einer aussagefähigen Fehlermeldung gegeben hat.
 
Hallo,

Vielen Dank für die Antwort.

Man sieht bei beiden am StackTrace, wo sie ausgelöst wurden. Was genau der Fehler war, kann manchmal etwas undeutlich sein, wenn sich der Programmierer nicht genug Mühe bei der Auswahl der richtigen Exception und/oder Generierung einer aussagefähigen Fehlermeldung gegeben hat.

Meinst du vielleicht damit, die selbstdefinierten Exceptions?

Gruss
R.
 
Checked Exceptions werden zur Anzeige von Fehlerzuständen benutzt, auf die "irgendwie sinnvoll" reagiert werden kann. Unchecked Exceptions werden benutzt, um einem Programmierer anzuzeigen, dass er einen Fehler gemacht hat.

Grad neulich gab es hier über checked vs unchecked eine Diskussion. Endlich einer, der das genauso sieht wie ich!

Ich tendiere inzwischen eher dazu, immer unchecked Exceptioins zu werfen.
...oder doch nicht 😀

Meine Meinung: Wenn irgendwo ein Fehler auftreten kann, gegen dessen Auftreten du zur Laufzeit nichts tun kannst, dann wirf eine checked Exception. Selbst wenn dir am Ende nix übrig bleibt außer die Anzeige einer Fehlermeldung mit Programm-Terminierung. Damit wird der Aufrufer gezwungen, auf den Fehler - sollte er eintreten - zu reagieren. Beispiel: Operationen auf dem Dateisystem. Du kannst als Programmierer nicht verhindern dass ein User evtl. die nötigen Rechte für das Lesen/Schreiben einer Datei nicht hat oder ob ihm grad die Festplatte durchbrennt.

Wie schon richtig gesagt stehen solchen Fehlern die Programmierfehler entgegen: Fehler, die auftreten weil was in deiner Programmlogik nicht stimmt. Bekanntestes Beispiel: NullPointerException. Die sind nicht checked, weil sie auch gar nicht auftreten, wenn du alles richtig gemacht hast.

Aus diesem Grund tendiere ich dazu, unchecked Exceptions zu vermeiden. Ich würde ein unchecked auch niemals abfangen, denn sie sollte gar nicht auftreten. Wenn ich aber davon ausgehe dass sie manchmal auftreten kann, ohne dass ich etwas dagegen tun könnte, dann mach ich sie checked damit mich der Compiler netterweise drauf aufmerksam macht und ich eine Behandlung nicht vergesse, was sich dann "Bug" nennen würde. (Eben weil die Fehler vllt bei dir nicht auftreten, bei anderen schon).

@TO: Man sollte das Wort "Fehler" nicht zu genau nehmen.. Exceptions stellen nicht unbedingt "Fehler" dar. Deswegen heißt es Exception und nicht Error. Es sind Ausnahmesituationen, auf die gesondert reagiert werden muss. Wenn man selbst Exceptions wirft dann plant man ja nicht, einen Fehler zu integrieren. Man möchte wie nillehammer auch schon richtig sagte lediglich die Info über eine spezielle Situation weiterreichen. Exceptions sind ein wesentlicher Bestandteil von OOP-Software, auch von einer die 100% korrekt läuft und nicht einen einzigen Fehler aufweisen kann.

@nillehammer
Du widersprichst dich doch irgendwie. Warum schmeißt du Exceptions die du selbst als Programmierfehler kategorisierst? Wäre es da nicht naheliegender den Fehler zu beheben statt eine Exception zu werfen? 😉 Ich habe schon im besagten Topic mitbekommen dass das der Trend tatsächlich hin zu unchecked Exceptions geht, ich verstehe aber noch immer nicht warum. Ich verstehe, dass manche checked Exceptions aus der API nerven, weil man dagegen gar nix tun kann oder will. z.B. bei Thread.sleep, wenn ich gar kein interrupt beabsichtige, ja diese try-catch-Blöcke nerven. Aber das ist imho eine Design-Fehlentscheidung aus der API, nicht grundsätzlich ein Manko der checked Exceptions. Ich verstehe nicht, warum man selbst auf checked Exceptions verzichten will, wogegen man in der Tat was tun kann. Ist doch einfach sicherer?! Die unchecked Exceptions fangt ihr ja auch ab, also wo is der Unterschied, außer das man's dummerweise vergessen kann? Ich will btw nicht das Thema umlenken, falls das jetzt nicht philosphisch werden soll. Aber ich würd's einfach gern begreifen, irgendwas muss ja an diesem Trend dran sein, aber ich seh's nicht. Alle sagen checked Exceptions waren eine Fehlentscheidung. Ich finde unchecked Exceptions waren eine Fehlentscheidung. Ich fang doch nix ab was aus kaputtem Code entsteht, ich fixe den Code.
 
Zuletzt bearbeitet:
Jaja... Exceptions und ihre Kinder... Widersprüche und Ungereimtheiten on Mass. Die erste Ungereimtheit ist die, dass die Urklasse jeder Exception sowie die jedes Fehlers - die Klasse Throwable - in Anführungszeichen eine "checked Exception" ist, man also Instanzen dieser Klasse allein schon abfangen oder weiterleiten muß, während man dies bei Instanzen einiger ihrer Unterklassen - Fehler (Error.class) und die sog. unchecked Exceptions - nicht mehr tun muß. Wer bestimmt, wann ein Throwable unbehandelt in den Quellcode einfliessen darf? Die zweite Ungereimtheit ist; Es gibt die Klasse Error, welche man theoretisch als Urklasse aller "unchecked Exceptions" bezeichnen könnte - Die Quelltexte zeigen aber, das es nicht so ist. Wenn man nun sagt, diese RuntimeExceptions sind, wie der Name schon andeutet, Laufzeitausnahmen 🙂lol🙂, dann wurden diese definitiv vom Programmierer verursacht und sind deswegen allein schon echte Fehler, die der Programmierer keinesfalls ignorieren sollte. Aus diesem Grund wären RuntimeExceptions für mich zumindest schon mal ein kleines Manko im Design der JVM. Natürlich gibt es Laufzeitfehler, gegen die ein Programmierer manchmal nichts machen kann, wie hdi schon gesagt hat. Aber selbst bei seinem Beispiel mit der Fesplatte bekommt man, lange bevor irgendwo eine RuntimeException fliegt, schon mal eine IOException. Aber dennoch gibt es auch andere Beispiele, in denen es für einen Programmierer notwendig ist eine RTE abzufangen. Dann sollte er aber bitte keine Exception an den User seiner Software weiterreichen, sondern ihm einen echten Error mitteilen, z.B. wenn die Initialisierung einer Klasse oder eines APIs von ebenso dubioser wie nicht vorhandener Hardware abhängt - [c]HeadlessException[/c]? Wie find' ich denn das? Bekommt man diese Exception, weil man ausnahmsweise mal in der Konsole (ohne X-Server o.ä) arbeitet? Ist doch -->mein neues Lieblingswort 😉.
 
@hdi: Du wohl kaum. Immerhin hast den Unterschied zwischen echten Fehlern (Error) und Ausnahmefehlern (Exception) ja schon richtig dargestellt. Sicher ist dir auch die Ironie in meiner Wortschöpfung "Laufzeitausnahme" (RuntimeException) nicht entgangen, denn mir wäre das Auftreten einer Solchen eigentlich mehr als suspekt und ich müsste mich als Prorammierer fragen, warum mein Programm ausnahmsweise mal nicht läuft und etwas dagegen tun, denn meines Wissens gibt es nur - ausser in Java - Laufzeitfehler. Kann ich aber zur Laufzeit nichts gegen einen auftretenden Fehler machen, muß ich wohl oder übel den Anwender darüber informieren, sprich; In Java eine RuntimeException abfangen und dafür einen Fehler ausgeben. "THIS PROGRAM CANNOT BE RUN IN DOS MODE" kennen sicher alle. Die HeadlessException ist - meiner Meinung nach völlig zu Unrecht - eine solche RuntimeException, denn obwohl ich als Programmierer einer GUI im weiteren Verlauf der Anwendung alles korrekt programmiert habe, kann ich nur sehr wenig dafür, wenn der Anwender diese GUI aus der Konsole ohne X-Server startet und deshalb blos diese Exception um die Ohren bekommt, weil ich mich dazu entschlossen habe, RTEs nicht zu verwenden bzw. abzufangen.
[EDIT]Ach ja... für mich sinds eher die "unchecked Exceptions", die ein Manko darstellen, eben weil es stets echte Fehler und nicht blos Ausnahmen sind.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben