G
Gast 777
Gast
Wann sollte man eigentlich eine RuntimeException werfen und wann eine normale Exception?
Also das finde ich jetzt ein bisschen zu einfach. Checked Exceptions haben durchaus ihre Berechtigung, mindestens überall dort wo man einen Fehler erwarten kann der vom Programm nicht beeinflusst werden kann.tfa hat gesagt.:Die kurze Antwort: benutz RuntimeExceptions.
Checked Exception haben keinen großen Nutzen, manche Leute sagen sogar, sie seien dubios oder problematisch. Ein Problem ist, dass solche Exceptions häufig einfach verschluckt werden[...]
Beni hat gesagt.:Also das finde ich jetzt ein bisschen zu einfach. Checked Exceptions haben durchaus ihre Berechtigung, mindestens überall dort wo man einen Fehler erwarten kann der vom Programm nicht beeinflusst werden kann.
Beispiel: man schreibt einen kleinen FTP-Client, der Code der sich mit dem Server verbindet kann nicht beeinflussen wann der Server abstürzt oder der User den Internetanschluss kappt. Da ist eine checked TimeOut- oder ServerMissing-Exception angebracht. Denn der Client sollte so eine Ausnahme wirklich behandeln, und nicht einfach abstürzen (eine RuntimeException kann ein Programm im schlimmsten Fall abschiessen, nämlich dann wenn sie nie behandelt wird. Für eine Checked-Exceptions ist das einges schwerer, da man checked-Exceptions öfters behandelt).
Ich hab oft Code gesehen, wo das geschieht, wobei ich die Programmierer nicht als doof bezeichnen würde.Was das Argument mit dem "verschlucken von Exceptions" angeht: Wenn der Programmierer zu doof ist zu programmieren, und derart elementare Fehler macht, wird das Projekt sowieso nix brauchbares... :bae:
Wenigstens da sind wir uns einig :bae:tfa hat gesagt.:Klar soll das Programm die Exception fangen und eine Fehlermeldung ausgeben.
Der Unterschied ist: der Compiler beschwert sich wenn du vergisst eine Checked Exception zu behandeln. Wenn du eine RuntimeException einfach vergisst, dann passiert halt nichts... bis der Fehler dann auftritt und du nachbessern darfst.Ebenso wie RuntimeExceptions (ganz oben) gefangen und eine Meldung ausgegeben wird. Keiner verlangt, das Programm abstürzen zu lassen.
Wo ist also der Unterschied zwischen der Behandlung einer checked und einer unchecked Exception? Es gibt keinen, nur dass man bei checked Exceptions noch viel mehr Code schreiben muss.
Ob ich aufrund meiner Doofheit oder aufgrund meiner Unerfahrenheit ohne Jacke in den Regen gehe macht keinen grossen Unterschied - ich werde trotzdem nass, kalt, schmutzig und krank. :wink:Ich hab oft Code gesehen, wo das geschieht, wobei ich die Programmierer nicht als doof bezeichnen würde.
Selbst Bruce Eckel (Thinking in Java) gibt zu, sowas schon gemacht zu haben -- nicht aus Dummheit sondern wohl eher aus Unerfahrenheit: Does Java need Checked Exceptions?.
If you do decide to use unchecked exceptions, you need to document this choice thoroughly, including documenting in Javadoc all the unchecked exceptions a method might throw. Johnson suggests making the decision between checked and unchecked exceptions on a package-by-package basis. When using unchecked exceptions, also remember that you may need to use try...finally blocked even when you are not catching any exceptions, so that you can perform cleanup actions such as closing database connections. With checked exceptions, we have try...catch to remind us to add a finally clause. With unchecked exceptions, we don't have that crutch to lean on.
Das ist mir schon klar. Ich meinte auch nicht den syntaktischen Unterschied in der Sprache Java, sondern den logischen Unterschied in der Exceptionbehandlung, und der ist irrelevant. D.h. die meisten Exceptions müssen sowieso ganz nach oben durchgereicht werden. Warum soll ich "ganz unten" gezwungen werden, mich darum zu kümmern?Beni hat gesagt.:Der Unterschied ist: der Compiler beschwert sich wenn du vergisst eine Checked Exception zu behandeln. Wenn du eine RuntimeException einfach vergisst, dann passiert halt nichts... bis der Fehler dann auftritt und du nachbessern darfst.Ebenso wie RuntimeExceptions (ganz oben) gefangen und eine Meldung ausgegeben wird. Keiner verlangt, das Programm abstürzen zu lassen.
Wo ist also der Unterschied zwischen der Behandlung einer checked und einer unchecked Exception? Es gibt keinen, nur dass man bei checked Exceptions noch viel mehr Code schreiben muss.
Und dieser Zwang ist wie gesagt überflüssig.Bei der checked Exception zwingt dich der Compiler halt dich bewusst zu entscheiden was du willst, während das bei der RuntimeException im Hintergrund passiert.
(Ich dachte, es war ursprünglich dein Beispiel, aber egal).In einem hochdynamischen Programm - wie diejenigen deiner Beispiele - kann eine checked-Exception keine wichtigen Informationen mehr transportieren (weil alles mögliche passieren kann), aber je mehr man in die konstanteren Detail-Implementierung geht desto wichtiger wird es auf die verschiedenen Fehler zu reagieren.
Dass Exceptions (Runtime oder nicht) dokumentiert werden müssen, halte ich für selbstverständlich. Was da jetzt die Anzahl der Entwickler mit zu tun hat, verstehe ich nicht.Ich glaub schon, dass RuntimeExceptions "bequemer" sind (ich habe auch schon welche aus Bequemlichkeit angewendet), aber wenn du dann nicht eine gute Dokumentation hast und mehrere Entwickler an dem Projekt arbeiten, dann gehen diese RuntimeExceptions einfach vergessen.
Wenn du nur mit perfekten, hocherfahrenen Super-Programmieren zusammen arbeiten darfst, kann ich dich nur beneiden :wink:Ob ich aufrund meiner Doofheit oder aufgrund meiner Unerfahrenheit ohne Jacke in den Regen gehe macht keinen grossen Unterschied - ich werde trotzdem nass, kalt, schmutzig und krank. :wink:Ich hab oft Code gesehen, wo das geschieht, wobei ich die Programmierer nicht als doof bezeichnen würde.
Selbst Bruce Eckel (Thinking in Java) gibt zu, sowas schon gemacht zu haben -- nicht aus Dummheit sondern wohl eher aus Unerfahrenheit: Does Java need Checked Exceptions?.
Ich auch. Nur habe ich die Erfahrung gemacht, dass es auch Fehler gibt die sehr spät und fast nicht sichtbar sind... :bae:Außerdem finde ich es richtig gut, wenn Fehler auftreten (möglichst früh und möglichst hart) und ich nachbessern darf.
Dokumentation ist so eine Sache. Viele Leute haben sie extrem gerne. Sehr wenige machen sich wirklich die Mühe eine zu schreiben. Ich fürchte mit dem "selbstverständlich" bist du in einer Minderheit.Dass Exceptions (Runtime oder nicht) dokumentiert werden müssen, halte ich für selbstverständlich. Was da jetzt die Anzahl der Entwickler mit zu tun hat, verstehe ich nicht.
Ich meinte deine Links mit "deinen Beispielen". Mein Beispiel ist nicht dynamisch, so ein ftp-client ist eher "trivial".(Ich dachte, es war ursprünglich dein Beispiel, aber egal).
Ich hatte einmal die Gelegenheit, und das war schon eine tolle und produktive Zeit. Aber im Allgemeinen gibt es nichts zu beneiden. :lol:Wenn du nur mit perfekten, hocherfahrenen Super-Programmieren zusammen arbeiten darfst, kann ich dich nur beneiden :wink:
Ich auch nicht. Aber so ein bisschen Diskussion ist doch auch mal ganz nett (statt immer nur Newbies bei den Hausaufgaben zu helfenBeni hat gesagt.:Es ist Sonntag-Abend und ich will mich nicht streiten.
Ich geb zu, Anspruch und Wirklichkeit sind immer noch zu weit voneinander entfernt. Aber ich arbeite dran.Dokumentation ist so eine Sache. Viele Leute haben sie extrem gerne. Sehr wenige machen sich wirklich die Mühe eine zu schreiben. Ich fürchte mit dem "selbstverständlich" bist du in einer Minderheit.Dass Exceptions (Runtime oder nicht) dokumentiert werden müssen, halte ich für selbstverständlich. Was da jetzt die Anzahl der Entwickler mit zu tun hat, verstehe ich nicht.
versuche mir gerade java privat anzueignen. dabei wird mir aber leider der unterschied zwischen geprüften und ungeprüften ausnahmen nicht ganz klar. ich habe zwar bsp. was eine ungeprüfte ausnahme ist, verstehe aber nicht warum diese nicht aufgefangen werden muss. ich lese immer nur das sie "typische" programmfehler darstellen und daher nicht aufgefangen werden müssen. aber bedeutet das nicht das jedesmal das programm beendet wird wenn eine solche ungeprüfte ausnahme auftritt? woran erkenn ich diese nun.
Der Witz ist, selbst Sun macht das an diversen Stellen genau so in der Java API. Ein schönes Beispiel ist Method#invoke(). Die Method wirft 3 checked Exceptions, was mal elendig nervig ist, die jedes mal zu fangen. Ich habe schon einige Stellen in der Java API gesehen, wo die Behandlung dieser 3 Exceptions jeweils identisch ist, und zwar so: throw new InternalError(e). :roll:tfa hat gesagt.:Aber es ist eine checked Exception, ich kann das ja nicht ändern - höchstens in eine RuntimeException kapseln und weiter werfen. Wenn es nötig ist, kannst du unchecked Exception ja ganz genauso durch try-catch auffangen und behandeln.