Ich arbeite an einer Java-Anwendung und sehe, dass Laufzeitausnahmen an vielen Stellen behandelt werden. Beispielsweise,
try {
// do something
} catch(NullPointerException e) {
return null;
}
Meine Frage ist, wann es eine gute Praxis ist, Laufzeitausnahmen zu behandeln. Wann sollten Ausnahmen unbehandelt bleiben?
java
exceptions
Vinoth Kumar CM
quelle
quelle
Antworten:
Es hängt davon ab, ob.
Zum Beispiel
Integer#parseInt
wirftNumberFormatException
(was eine RTE ist), wenn die bereitgestellte Zeichenfolge nicht analysiert werden kann. Aber sicher möchten Sie nicht, dass Ihre App abstürzt, nur weil der Benutzer "x" in ein Textfeld geschrieben hat, das für ganze Zahlen gedacht ist? Und woher wissen Sie, ob die Zeichenfolge analysiert werden kann, es sei denn, Sie versuchen zuerst, sie zu analysieren? In diesem Fall ist die RTE also nur ein Fehlersignal, das eine Fehlermeldung verursachen sollte. Man könnte argumentieren , dass es sollte eine geprüfte Ausnahme sein, aber was kann man tun - es ist nicht.quelle
Integer#parseInt
sollte wirklich einMaybe<Integer>
stattdessen zurückgeben und überhaupt keine Ausnahme auslösen.NullPointerExceptions sind normalerweise das Zeichen einer fehlenden Nullprüfung. Anstatt es so abzufangen, sollten Sie die entsprechende Nullprüfung hinzufügen, um sicherzustellen, dass die Ausnahme nicht ausgelöst wird.
Manchmal ist es jedoch angebracht, RunTimeExceptions zu behandeln. Zum Beispiel, wenn Sie den Code nicht ändern können, um die Nullprüfung an der entsprechenden Stelle hinzuzufügen, oder wenn die Ausnahme etwas anderes als eine NullPointerException ist.
Ihr Beispiel für den Umgang mit Ausnahmen ist schrecklich. Auf diese Weise verlieren Sie die Stapelverfolgung und genaue Informationen zum Problem. Und Sie lösen es tatsächlich nicht, da Sie wahrscheinlich eine weitere NullPointerException an einem anderen Ort auslösen und irreführende Informationen darüber erhalten, was passiert ist und wie es gelöst werden kann.
quelle
return null;
) ist eine bessere Lösung.new
wirftstd::bad_alloc
in C ++.Ich behandle erwartete Ausnahmen dort, wo ich sie erwarte. (Wie DB Lese- / Schreibfehler). Unerwartete Ausnahmen sprudele ich in die Luft. Irgendwo anders kann die Ausnahme erwartet werden und die Logik dafür haben.
quelle
Ausnahmen sollten genau das sein .. Ausnahmen. Die beste Vorgehensweise bei der Verwendung von Ausnahmen besteht darin, sie zu verwenden, um die Situation abzudecken, in der etwas passiert, das nicht dem entspricht, was Sie erwarten würden. Das klassische Beispiel ist die FileNotFoundException, die ausgelöst wird, wenn eine Datei einfach nicht vorhanden ist. Wenn Sie die Existenz der Datei testen, verwenden Sie File.exists (), da Sie einfach mit einem 10-Fuß-Stick stoßen, um zu sehen, ob Sie etwas treffen.
Sie könnten technisch die gleichen Ergebnisse erzielen, indem Sie sie in einem Try-Catch umgeben und die Datei so verwenden, als ob sie vorhanden wäre. A) Ausnahmen sind jedoch im Allgemeinen ressourcenintensiv und B) Programmierer gehen davon aus, dass Sie gemeint haben, dass die Datei vorhanden ist, wenn sie vorhanden ist in einem Try-Catch, der zur allgemeinen Verwirrung eines Programms beiträgt.
Es gibt viele Situationen, in denen ich eine Methode schreibe, die einen Wert aus einer Datenbank abruft. Tausend Dinge könnten schief gehen, und da ich nur eine kleine Information benötige, ist es unpraktisch, den Anruf mit einer Try-Catch-Liste zu umgeben, die 5 verschiedene Ausnahmen enthält. Also werde ich Ausnahmen in der Abrufmethode abfangen. Wenn etwas schief geht, ergreife ich die entsprechenden Maßnahmen, um die Datenbankverbindung oder so weiter in der finally-Klausel zu schließen und null zurückzugeben. Dies ist eine gute Vorgehensweise, nicht nur, weil es Ihren Code vereinfacht, sondern auch, weil "null" dieselbe Nachricht sendet, die Sie von einer Ausnahme hätten erhalten können. Dass etwas nicht wie geplant gelaufen ist. Verwalten Sie Ausnahmespezifikationen in der Abrufmethode, aber verwalten Sie, was zu tun ist, wenn die Dinge nicht funktionieren.
Beispielsweise:
quelle
Ja, Sie behandeln Laufzeitausnahmen korrekt. Dies ist keine gute Vorgehensweise. Der Grund dafür ist, dass dies als kostspielig / speicherintensiv angesehen wird.
quelle