Was ist die allgemeine Faustregel bei der Entscheidung, ob throws
einer Methode eine Klausel hinzugefügt oder eine verwendet werden soll try-catch
?
Nach dem, was ich selbst gelesen habe, throws
sollte das verwendet werden, wenn der Anrufer sein Vertragsende gebrochen hat (übergebenes Objekt), und das try-catch
sollte verwendet werden, wenn während einer Operation, die innerhalb der Methode ausgeführt wird, eine Ausnahme auftritt. Ist das richtig? Wenn ja, was ist auf der Anruferseite zu tun?
PS: Durch Google und SO gesucht, möchte aber eine klare Antwort auf diese Frage.
Antworten:
quelle
Im Allgemeinen sollte eine Methode eine Ausnahme an ihren Aufrufer senden, wenn sie das zugehörige Problem lokal nicht behandeln kann. Wenn die Methode beispielsweise aus einer Datei mit dem angegebenen Pfad lesen soll,
IOExceptions
kann sie lokal nicht sinnvoll behandelt werden. Gleiches gilt für ungültige Eingaben. Meine persönliche Entscheidung wäre, eine ungeprüfte Ausnahme wieIllegalArgumentException
in diesem Fall auszulösen .Und es sollte eine Ausnahme von einer aufgerufenen Methode abfangen, wenn:
DAO
VerwendungenHibernate
für das Fortbestehen meiner Entitäten verwendet werden Ich fange alleHibernateExceptions
lokal ab und konvertiere sie in meine eigenen Ausnahmetypen.quelle
So benutze ich es:
Würfe:
Try-Catch:
Ich kenne viele Leute, die Throws immer benutzen, weil es sauberer ist, aber es gibt bei weitem nicht so viel Kontrolle.
quelle
Meine persönliche Faustregel dafür ist einfach:
try/catch
. Mit "Handle" meine ich, den Benutzer informieren / Fehler beheben oder im weiteren Sinne verstehen zu können, wie sich diese Ausnahme auf die Ausführung meines Codes auswirkt.Hinweis: Diese Antwort ist jetzt ein Community-Wiki. Sie können gerne weitere Informationen hinzufügen.
quelle
Die Entscheidung, Ihren Methoden eine try-catch- oder eine throw-Klausel hinzuzufügen, hängt davon ab, "wie Sie Ihre Ausnahme behandeln möchten (oder müssen)".
Der Umgang mit einer Ausnahme ist eine weitreichende und alles andere als triviale Frage. Es beinhaltet insbesondere die Entscheidung, wo die Ausnahme behandelt werden soll und welche Aktionen innerhalb des catch-Blocks implementiert werden sollen. In der Tat sollte die Behandlung einer Ausnahme eine globale Entwurfsentscheidung sein.
Bei der Beantwortung Ihrer Fragen gibt es keine Faustregel.
Sie müssen entscheiden, wo Sie Ihre Ausnahme behandeln möchten, und diese Entscheidung ist normalerweise sehr spezifisch für Ihre Domain- und Anwendungsanforderungen.
quelle
Wenn die Methode, bei der die Ausnahme ausgelöst wurde, über eine ausreichende Menge an Informationen verfügt, um damit umzugehen, sollte sie abfangen und nützliche Informationen darüber generieren, was passiert ist und welche Daten verarbeitet wurden.
quelle
Eine Methode sollte nur dann
throws
eine Ausnahme bilden, wenn sie angemessene Garantien für den Status des Objekts, alle an die Methode übergebenen Parameter und alle anderen Objekte, auf die die Methode einwirkt, geben kann. Beispielsweise kann eine Methode, die ein Element aus einer Sammlung abrufen soll, von dem der Aufrufer erwartet, dass es darin enthalten ist,throws
eine aktivierte Ausnahme darstellen, wenn das Element, von dem erwartet wurde, dass es in der Sammlung vorhanden ist, dies nicht tut. Ein Aufrufer, der diese Ausnahme abfängt, sollte erwarten, dass die Sammlung das betreffende Element nicht enthält.Beachten Sie, dass Java zwar zulässt, dass geprüfte Ausnahmen durch eine Methode in die Luft sprudeln, die als Auslösen von Ausnahmen der entsprechenden Typen deklariert ist, diese Verwendung jedoch im Allgemeinen als Anti-Pattern betrachtet werden sollte. Stellen Sie sich zum Beispiel vor, dass eine Methode
LookAtSky()
als aufrufend deklariertFullMoonException
ist und sie voraussichtlich auslösen wird, wenn der Mond voll ist. Stellen Sie sich weiter vor, dassLookAtSky()
AnrufeExamineJupiter()
, die auch als deklariert werdenthrows FullMoonException
. Wenn aFullMoonException
von geworfenExamineJupiter()
wurde undLookAtSky()
es nicht auffing und entweder damit umging oder es in einen anderen Ausnahmetyp einwickelte,LookAtSky
würde der aufgerufene Code annehmen, dass die Ausnahme darauf zurückzuführen ist, dass der Erdmond voll ist; es hätte keine Ahnung, dass einer von Jupiters Monden der Schuldige sein könnte.Ausnahmen, die ein Aufrufer möglicherweise behandeln wird (einschließlich im Wesentlichen aller geprüften Ausnahmen), sollten nur dann durch eine Methode übertragen werden können, wenn die Ausnahme für den Aufrufer der Methode dasselbe bedeutet wie für die aufgerufene Methode. Wenn Code eine Methode aufruft, die als ausgelöste Ausnahme deklariert ist, der Aufrufer jedoch nicht erwartet, dass diese Ausnahme in der Praxis jemals ausgelöst wird (z. B. weil er glaubt, dass es sich um vorab validierte Methodenargumente handelt), sollte die geprüfte Ausnahme abgefangen und umbrochen werden in einem ungeprüften Ausnahmetyp. Wenn der Anrufer nicht erwartet, dass die Ausnahme ausgelöst wird, kann der Anrufer nicht erwarten, dass sie eine bestimmte Bedeutung hat.
quelle
Wann was zu verwenden. Ich habe viel darüber gesucht. Es gibt keine feste Regel.
"Als Entwickler müssen jedoch geprüfte Ausnahmen in eine Throws-Klausel der Methode aufgenommen werden. Dies ist erforderlich, damit der Compiler weiß, welche Ausnahmen zu prüfen sind. Konventionell sollten nicht aktivierte Ausnahmen nicht in eine Throws-Klausel aufgenommen werden. Das
Einschließen dieser Ausnahmen wird berücksichtigt Der Compiler behandelt sie als Kommentare und überprüft sie nicht. "
Quelle: SCJP 6 Buch von Kathy Sierra
quelle
Wenn Sie einen Try-Catch verwenden und die Ausnahme auftritt, werden die verbleibenden Codes weiterhin ausgeführt.
Wenn Sie die Methode zum Auslösen der Ausnahme angeben, wird der Code beim Auftreten der Ausnahme sofort nicht mehr ausgeführt.
quelle
Das Try-Catch-Paar wird verwendet, wenn Sie ein benutzerdefiniertes Verhalten bereitstellen möchten, falls eine Ausnahme auftritt ..... mit anderen Worten ... Sie haben eine Lösung für Ihr Problem (Auftreten einer Ausnahme) gemäß Ihren Programmanforderungen .... .
Aber Würfe werden verwendet, wenn Sie keine spezifische Lösung für den Fall des Auftretens von Ausnahmen haben ... Sie möchten einfach keine abnormale Beendigung Ihres Programms erhalten ...
Hoffe es ist richtig :-)
quelle