Die meiste Zeit werde ich eine Ausnahme verwenden, um nach einer Bedingung in meinem Code zu suchen. Ich frage mich, wann es ein angemessener Zeitpunkt ist, eine Behauptung zu verwenden.
Zum Beispiel,
Group group=null;
try{
group = service().getGroup("abc");
}catch(Exception e){
//I dont log error because I know whenever error occur mean group not found
}
if(group !=null)
{
//do something
}
Können Sie angeben, wie eine Behauptung hier hineinpasst? Soll ich eine Behauptung verwenden?
Es scheint, als würde ich niemals Zusicherungen im Produktionscode verwenden und nur Zusicherungen in Komponententests sehen. Ich weiß, dass ich in den meisten Fällen nur Ausnahmen verwenden kann, um die Prüfung wie oben durchzuführen, aber ich möchte wissen, wie dies "professionell" angemessen durchgeführt werden kann.
Aus meinem Kopf (die Liste ist möglicherweise unvollständig und zu lang, um in einen Kommentar zu passen) würde ich sagen:
Mit anderen Worten, Ausnahmen betreffen die Robustheit Ihrer Anwendung, während Zusicherungen deren Richtigkeit betreffen.
Behauptungen sind so konzipiert, dass sie billig zu schreiben sind. Sie können sie fast überall verwenden, und ich verwende diese Faustregel: Je mehr eine Behauptung dumm aussieht, desto wertvoller ist sie und desto mehr Informationen werden eingebettet. Wenn Sie ein Programm debuggen, das sich nicht richtig verhält, werden Sie anhand Ihrer Erfahrung sicherlich die offensichtlicheren Fehlermöglichkeiten prüfen. Dann werden Sie nach Problemen suchen, die einfach nicht auftreten können: Genau hier helfen Behauptungen viel und sparen Zeit.
quelle
Denken Sie daran, dass Zusicherungen zur Laufzeit mithilfe von Parametern deaktiviert werden können und standardmäßig deaktiviert sind. Verlassen Sie sich daher nur zu Debugging-Zwecken darauf.
Lesen Sie auch den Oracle-Artikel über Assert , um weitere Fälle zu sehen, in denen Assert verwendet oder nicht verwendet werden soll.
quelle
Generell:
java
Befehl standardmäßig alle Zusicherungen deaktiviert.)Der folgende Code aus Ihrer Frage ist schlecht und möglicherweise fehlerhaft
Das Problem ist, dass Sie NICHT wissen, dass eine Ausnahme bedeutet, dass die Gruppe nicht gefunden wurde. Es ist auch möglich, dass der
service()
Aufruf eine Ausnahmenull
ausgelöst hat oder zurückgegeben wurde, was dann eine verursachteNullPointerException
.Wenn Sie eine "erwartete" Ausnahme abfangen, sollten Sie nur die erwartete Ausnahme abfangen . Indem
java.lang.Exception
Sie das Problem abfangen (und insbesondere nicht protokollieren), erschweren Sie die Diagnose / Fehlerbehebung des Problems und ermöglichen der App möglicherweise, mehr Schaden anzurichten.quelle
Zurück bei Microsoft war die Empfehlung, Ausnahmen in alle APIs zu werfen, die Sie öffentlich zur Verfügung stellen, und Asserts in allen möglichen Annahmen zu internem Code zu verwenden. Es ist eine etwas lockere Definition, aber ich denke, es liegt an jedem Entwickler, die Grenze zu ziehen.
In Bezug auf die Verwendung von Ausnahmen sollte deren Verwendung, wie der Name schon sagt, außergewöhnlich sein. Für den oben angegebenen Code
getGroup
sollte der Aufruf zurückgegeben werden,null
wenn kein Dienst vorhanden ist. Eine Ausnahme sollte nur auftreten, wenn eine Netzwerkverbindung unterbrochen wird oder ähnliches.Ich denke, die Schlussfolgerung ist, dass es für jede Anwendung etwas dem Entwicklungsteam überlassen bleibt, die Grenzen von Assert gegen Ausnahmen zu definieren.
quelle
Laut diesem Dokument http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general "ist die assert-Anweisung für nicht öffentliche Vorbedingungen, Nachbedingungen und Klasseninvarianten geeignet Überprüfung. Die Überprüfung öffentlicher Vorbedingungen sollte weiterhin durch Überprüfungen innerhalb von Methoden durchgeführt werden, die insbesondere zu dokumentierten Ausnahmen führen, z. B. IllegalArgumentException und IllegalStateException. "
Wenn Sie mehr über Vorbedingungen, Nachbedingungen und Klasseninvarianten erfahren möchten, lesen Sie dieses Dokument: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . Es enthält auch Beispiele für die Verwendung von Behauptungen.
quelle
Beim Testen auf Null werden nur Nullen abgefangen, die Probleme verursachen, während bei einem Versuch / Fang, wie Sie ihn haben, alle Fehler abgefangen werden .
Im Allgemeinen ist try / catch sicherer, aber etwas langsamer, und Sie müssen darauf achten, dass Sie alle Arten von Fehlern abfangen, die auftreten können. Ich würde also sagen, benutze try / catch - eines Tages könnte sich der getGroup-Code ändern, und du brauchst möglicherweise nur dieses größere Netz.
quelle
Sie können diesen einfachen Unterschied während ihrer Verwendung berücksichtigen. Ausnahmen werden zum Überprüfen erwarteter und unerwarteter Fehler verwendet, die als geprüfter und nicht aktivierter Fehler bezeichnet werden, während die Zusicherung zur Laufzeit hauptsächlich zu Debugging-Zwecken verwendet wird, um festzustellen, ob die Annahmen validiert sind oder nicht.
quelle
Ich gebe zu, ich bin ein wenig verwirrt von Ihrer Frage. Wenn eine Assertionsbedingung nicht erfüllt ist, wird eine Ausnahme ausgelöst. Verwirrenderweise wird dies AssertionError genannt . Beachten Sie, dass das Kontrollkästchen deaktiviert ist, z. B. IllegalArgumentException, die unter sehr ähnlichen Umständen ausgelöst wird.
Verwenden Sie also Assertions in Java
quelle
Siehe Abschnitt 6.1.2 (Zusicherungen im Vergleich zu anderen Fehlercodes) in der Dokumentation von Sun unter dem folgenden Link.
http://www.oracle.com/technetwork/articles/javase/javapch06.pdf
Dieses Dokument gibt den besten Rat, den ich gesehen habe, wann Behauptungen verwendet werden sollen. Zitat aus dem Dokument:
"Eine gute Faustregel ist, dass Sie eine Behauptung für Ausnahmefälle verwenden sollten, die Sie vergessen möchten. Eine Behauptung ist der schnellste Weg, um mit einer Bedingung oder einem Zustand umzugehen und diese zu vergessen, die Sie nicht erwarten müssen Zurecht kommen."
quelle
Asserts können leider deaktiviert werden. Wenn Sie in der Produktion sind, brauchen Sie alle Hilfe, die Sie bekommen können, um etwas Unvorhergesehenes aufzuspüren.
quelle