Was ist die Faustregel, wenn Sie entscheiden, ob Sie eine throws
-Klausel zu einer Methode hinzufügen oder ein try-catch
verwenden möchten?
Nach dem, was ich selbst gelesen habe, sollte throws
verwendet werden, wenn der Aufrufer das Vertragsende gebrochen hat (Objekt übergeben), und try-catch
sollte verwendet werden, wenn während einer innerhalb einer Methode ausgeführten Operation eine Ausnahme auftritt. Ist das richtig? Wenn ja, was ist auf Anruferseite zu tun?
P.S: Durchsucht durch Google und SO, hätte aber gerne eine klare Antwort auf diese Frage.
Im Allgemeinen sollte eine Methode eine Ausnahme für den Aufrufer auslösen, wenn das zugeordnete Problem nicht lokal behandelt werden kann. Z.B. Wenn die Methode aus einer Datei mit dem angegebenen Pfad lesen soll, kann IOExceptions
nicht lokal sinnvoll behandelt werden. Dasselbe gilt für ungültige Eingaben und fügt hinzu, dass meine persönliche Entscheidung darin besteht, in diesem Fall eine ungeprüfte Ausnahme wie IllegalArgumentException
auszulösen.
Und es sollte eine Ausnahme von einer aufgerufenen Methode fangen, wenn:
DAO
Hibernate
für das Bestehen meiner Entitäten verwendet so fange ich alle HibernateExceptions
lokal auf und konvertiere sie in meine eigenen Ausnahmetypen.Meine persönliche Faustregel dafür ist einfach:
try/catch
ein. Ich meine damit, den Benutzer informieren/von Fehlern befreien oder in einem weiteren Sinn verstehen zu können, wie diese Ausnahme die Ausführung meines Codes beeinflusst.Hinweis: Diese Antworten sind jetzt ein Community-Wiki. Fügen Sie weitere Informationen hinzu.
So verwende ich es:
Würfe:
Try-Catch:
Ich kenne viele Leute, die Throws immer verwenden, weil es sauberer ist, aber es gibt einfach nicht so viel Kontrolle.
Die Entscheidung, Ihren Methoden eine try-catch- oder eine throws-Klausel hinzuzufügen, hängt davon ab, "wie Sie mit Ihrer Ausnahme umgehen wollen (oder müssen)".
Wie mit einer Ausnahme umzugehen ist, ist eine weit gefasste und alles andere als triviale Frage. Dabei muss insbesondere festgelegt werden, wo die Ausnahme behandelt werden soll und welche Aktionen innerhalb des catch-Blocks ausgeführt werden sollen. In der Tat sollte der Umgang mit einer Ausnahme eine globale Entwurfsentscheidung sein.
Bei der Beantwortung Ihrer Fragen gibt es keine Faustregel.
Sie müssen entscheiden, wo Sie mit Ihrer Ausnahme umgehen möchten. Diese Entscheidung ist in der Regel sehr spezifisch für Ihre Domänen- und Anwendungsanforderungen.
Wenn die Methode, bei der die Ausnahmebedingung ausgelöst wurde, ausreichend Informationen enthält, sollte sie sich einfangen und nützliche Informationen darüber generieren, was passiert ist und welche Daten verarbeitet wurden.
Wann was verwenden? Ich habe viel darüber gesucht. Es gibt keine feste Regel.
Msgstr "Als Entwickler müssen jedoch Checked - Ausnahmen in einer Throws - Klausel der Methode enthalten sein. Dies ist notwendig, damit der Compiler wissen kann, welche Exceptions geprüft werden sollen.
Das Einschließen von ihnen gilt als schlechte Programmierpraxis. Der Compiler behandelt sie als Kommentar und prüft sie nicht. "
Quelle: SCJP 6-Buch von Kathy Sierra
Eine Methode sollte nur eine throws
-Ausnahme sein, wenn sie den Status des Objekts, die an die Methode übergebenen Parameter und alle anderen Objekte, auf die die Methode wirkt, mit angemessenen Garantien abschließen kann. Eine Methode, die ein Element, von dem der Anrufer erwartet, dass sie darin enthalten ist, aus einer Sammlung abrufen soll, kann throws
eine überprüfte Ausnahme sein, wenn das Element, das in der Sammlung erwartet wurde, dies nicht tut. Ein Aufrufer, der diese Ausnahme abfängt, sollte erwarten, dass die Sammlung den fraglichen Artikel nicht enthält.
Beachten Sie, dass Java zwar aktivierte Ausnahmen durch eine Methode aufblähen lässt, die als auslösende Ausnahmen der entsprechenden Typen deklariert wird, eine solche Verwendung jedoch generell als Anti-Muster betrachtet wird. Stellen Sie sich zum Beispiel vor, dass eine Methode LookAtSky()
als Aufruf von FullMoonException
deklariert ist und von ihr erwartet wird, wenn der Mond voll ist. Stellen Sie sich weiter vor, dass LookAtSky()
ExamineJupiter()
aufruft, die auch als throws FullMoonException
deklariert ist. Wenn eine FullMoonException
von ExamineJupiter()
geworfen wurde und LookAtSky()
es nicht auffangen und entweder handhaben oder in einen anderen Ausnahmetyp einwickeln würde, würde der Code, der LookAtSky
aufrief, annehmen, dass die Ausnahme ein Ergebnis davon war, dass der Mond der Erde voll war. Es hätte keine Ahnung, dass einer der Monde des Jupiter der Täter sein könnte.
Ausnahmen, die ein Aufrufer erwarten kann (einschließlich im Wesentlichen aller aktivierten Ausnahmen), sollten nur dann eine Methode durchlaufen, wenn die Ausnahme für den Aufrufer der Methode dieselbe Bedeutung hat wie für die aufgerufene Methode. Wenn der Code eine Methode aufruft, die als ausgeworfene Ausnahmebedingung deklariert ist, der Aufrufer jedoch nicht erwartet, dass diese Ausnahmebedingung in der Praxis jemals ausgelöst wird (z. B. weil er vorvalidierte Methodenargumente vermutet), sollte die geprüfte Ausnahmebedingung abgefangen und eingeschlossen werden in einigen ungeprüften Ausnahmetypen. Wenn der Anrufer nicht erwartet, dass die Ausnahme ausgelöst wird, kann der Anrufer nicht erwarten, dass er eine bestimmte Bedeutung hat.
das try-catch-Paar wird verwendet, wenn Sie ein benutzerdefiniertes Verhalten angeben möchten, falls eine Ausnahme auftritt ..... mit anderen Worten: Sie haben eine Lösung Ihres Problems (Ausnahmefall) gemäß Ihren Programmanforderungen. .
Würfe werden jedoch verwendet, wenn Sie keine spezielle Lösung in Bezug auf den Ausnahmefall haben.
Hoffe es ist richtig :-)
Wenn Sie einen Try-Catch verwenden, werden beim Auftreten der Ausnahme die übrigen Codes noch ausgeführt.
Wenn Sie die Methode zum Auslösen der Ausnahme angeben, wird der Code bei Auftreten der Ausnahme sofort beendet.