it-swarm.com.de

Würfe oder Try-Catch

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.

63
James P.
  • fangen Sie eine Ausnahme nur, wenn Sie sie sinnvoll behandeln können
  • erklären, dass die Ausnahme nach oben geworfen wird, wenn sie vom Verbraucher der aktuellen Methode behandelt werden soll
  • ausnahmen auslösen, wenn sie durch die Eingabeparameter verursacht werden (diese werden jedoch öfter deaktiviert)
46
Bozho

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:

  • es ist etwas, das lokal gehandhabt werden kann (z. B. beim Versuch, eine Eingabezeichenfolge in eine Zahl zu konvertieren. Wenn die Konvertierung fehlschlägt, ist es völlig zulässig, stattdessen einen Standardwert zurückzugeben.)
  • oder es sollte nicht geworfen werden (z. B. wenn die Ausnahme von einer implementierungsspezifischen unteren Schicht stammt, deren Implementierungsdetails für den Aufrufer nicht sichtbar sein sollten). Ich möchte zum Beispiel nicht zeigen, dass meine DAOHibernate für das Bestehen meiner Entitäten verwendet so fange ich alle HibernateExceptions lokal auf und konvertiere sie in meine eigenen Ausnahmetypen.
13
Péter Török

Meine persönliche Faustregel dafür ist einfach:

  • Kann ich damit umgehen auf sinnvolle Weise (vom Kommentar hinzugefügt)? Geben Sie den Code in 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.
  • An anderer Stelle, wirf es weg

Hinweis: Diese Antworten sind jetzt ein Community-Wiki. Fügen Sie weitere Informationen hinzu.

9
Riduidel

So verwende ich es:

Würfe:  

  • Sie möchten nur, dass der Code stoppt, wenn ein Fehler auftritt.
  • Gut für Methoden, die anfällig für Fehler sind, wenn bestimmte Voraussetzungen nicht erfüllt sind

Try-Catch:  

  • Wenn Sie möchten, dass sich das Programm Mit unterschiedlichen -Fehlern anders verhält.
  • Großartig, wenn Sie Endbenutzern aussagekräftige Fehler zur Verfügung stellen möchten.

Ich kenne viele Leute, die Throws immer verwenden, weil es sauberer ist, aber es gibt einfach nicht so viel Kontrolle.

7
Justian Meyer

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.

3
EijiAdachi

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.

2

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

1
sofs1

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.

1
supercat

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 :-)

0
user8148636

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.

0
Jarkid