Frage

Die meiste Zeit ich eine Ausnahme verwenden werde für einen Zustand, in meinem Code zu überprüfen, frage ich mich, wenn es eine angemessene Zeit ist eine Behauptung zu benutzen?

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önnten Sie geben an, wie eine Behauptung passt hier? Soll ich eine Behauptung benutzen?

Es scheint, als ob ich nie Behauptungen in Produktionscode verwenden und nur Behauptungen in Unit-Tests sehen. Ich weiß, dass in den meisten Fällen kann ich nur Ausnahme verwenden, um die Überprüfung, wie oben zu tun, aber ich mag geeignete Art und Weise wissen, es zu tun „professionell“.

War es hilfreich?

Lösung

Assertions sollten verwendet werden, um etwas zu überprüfen, die nie passieren sollten, während eine Ausnahme verwendet werden soll, etwas zu überprüfen, was passieren könnte.

Zum Beispiel könnte eine Funktion von 0 dividieren, so eine Ausnahme verwendet werden soll, sondern eine Behauptung verwendet werden könnte, zu prüfen, ob die Festplatte plötzlich verschwindet.

Eine Behauptung würde das Programm stoppen läuft, aber eine Ausnahme würde lassen Sie das Programm weiterlaufen.

Beachten Sie, dass if(group != null) nicht eine Behauptung ist, dass nur ein bedingtes ist.

Andere Tipps

Aus meinem Verstand (Liste unvollständig sein kann, und ist zu lang, um fit in einem Kommentar), würde ich sagen:

  • verwenden Ausnahmen, wenn Parameter übergeben zu öffentlichen oder geschützten Methoden und Konstruktoren Überprüfung
  • verwenden Ausnahmen, wenn Interaktion mit dem Benutzer oder wenn Sie den Client-Code erwarten von einer außergewöhnlichen Lage
  • erholen
  • verwenden Ausnahmen Adresse Probleme, die auftreten können,
  • Verwendung Behauptungen bei der Überprüfung Vorbedingungen, post-Bedingungen und Invarianten von privatem / internem Code
  • Verwendung Behauptungen Feedback an sich selbst oder Ihr Entwickler-Team zu schaffen
  • Behauptungen Gebrauch, wenn für die Dinge, die Überprüfung sehr unwahrscheinlich passiert sonst bedeutet es, dass es eine ernst fl aw in Ihrer Anwendung
  • verwenden Behauptungen Zustand Dinge, die man (angeblich) wissen, um wahr zu sein

Mit anderen Worten, Adresse Ausnahmen der Robustheit der Anwendung während Behauptungen deren Richtigkeit Adresse.

Assertions sind so konzipiert, billig zu schreiben, können Sie sie benutzen, fast überall und ich bin mit dieser Faustregel: Je mehr eine Behauptung Aussage sieht dumm, desto wertvoller ist er und desto mehr Informationen es einbettet. Wenn Sie ein Programm debuggen, die nicht die richtige Art und Weise verhält, werden Sie sicherlich überprüfen die mehr offensichtliche Möglichkeiten Scheitern nach Ihren persönlichen Erfahrung. Dann werden Sie für Probleme überprüfen, dass einfach nicht passieren. Dies ist genau das, wenn Behauptungen viel und spart Zeit helfen

Denken Sie daran, Assertions können zur Laufzeit mit Hilfe von Parametern deaktiviert werden, und sind standardmäßig deaktiviert, also nicht auf sie zählen außer Zwecke für die Fehlersuche.

Auch sollten Sie die Oracle Artikel über assert lesen mehr Fälle zu sehen, wo verwenden - oder nicht verwenden -. assert

Als allgemeine Regel gilt:

  • Verwenden Behauptungen für interne Konsistenzprüfungen, wo es überhaupt nicht egal, ob jemand schaltet sie aus. (Beachten Sie, dass die java Befehl schaltet alle Behauptungen standardmäßig aktiviert.)
  • Verwenden Sie regelmäßige Tests für jede Art von Kontrollen, welche nicht ausgeschaltet werden sollen. Diese enthält Defensive überprüft, dass Schutz gegen mögliche Schäden durch Fehler, und alle Validierungsdaten / Wünsche / was auch immer von anderen Nutzern oder externe Dienstleistungen zur Verfügung gestellt.

Der folgende Code aus Ihrer Frage ist schlechter Stil und möglicherweise Buggy

try {
    group = service().getGroup("abc");
} catch (Exception e) {
    //i dont log error because i know whenever error occur mean group not found
}

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 hat eine Ausnahme, oder dass es null zurückgegeben, die dann eine NullPointerException verursacht wird.

Wenn Sie eine „erwartete“ Ausnahme zu fangen, sollten Sie fangen nur die Ausnahme, dass Sie erwarten. Durch das Abfangen java.lang.Exception (und vor allem, indem Sie es nicht), werden Sie es schwieriger machen / debug das Problem zu diagnostizieren und möglicherweise die App so dass mehr Schaden tun.

Nach diesem doc http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general „Die assert-Anweisung ist für nicht-öffentliche Voraussetzung, Nachbedingung und Klasseninvariante Prüfung. öffentliche Voraussetzung Prüfung noch durch Kontrollen innerhalb Methoden dieses Ergebnis insbesondere dokumentiert Ausnahmen, wie Illegal und Illegal. "

durchgeführt werden soll

Wenn Sie mehr über Voraussetzung, Nachbedingung und Klasseninvariante wissen wollen, lesen Sie in diesem Dokument: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . Es enthält auch Beispiele für Behauptungen Nutzung.

Nun, zurück an Microsoft, war die Empfehlung Ausnahmen in allen APIs zu werfen machen Sie öffentlich zugänglich und die Nutzung Asserts in allen möglichen Annahmen Sie Code machen, die innere ist. Es ist ein bisschen von einer losen Definition, aber ich denke, es ist für jeden Entwickler, um die Linie zu zeichnen.

Im Hinblick auf die Verwendung von Ausnahmen, wie der Name schon sagt, ihre Nutzung außergewöhnlich sein soll, damit für den Code, den Sie oben darstellen, sollte der getGroup Anruf null zurückgeben, wenn kein Dienst vorhanden ist. Ausnahme sollte nur erfolgen, wenn eine Netzwerkverbindung ausfällt oder so ähnlich.

ich denke, die Schlussfolgerung ist, dass es ein bisschen ist für jede Anwendung an das Entwicklungsteam links unten die Grenzen der assert vs Ausnahmen zu definieren.

Die Prüfung auf null nur Nullen fangen Probleme zu verursachen, während eine try / catch wie Sie es fangen jeder Fehler.

Im Großen und Ganzen try / catch ist sicherer, aber etwas langsamer, und Sie müssen vorsichtig sein, dass Sie alle Arten von Fehler zu fangen, die auftreten können. Also ich würde den Einsatz try / catch sagen -. Der Code getGroup einen Tag ändern kann, und Sie können nur, dass größeres Netz benötigen

Sie können diesen einfachen Unterschied im Auge verwenden, während ihrer Nutzung. Ausnahmen werden für die Überprüfung erwarteter und unerwarteter Fehler geprüft und ungeprüft Fehler genannt verwendet werden, während Behauptung für Debugging-Zwecke zur Laufzeit in erster Linie verwendet wird, um zu sehen, ob die Annahmen validiert sind oder nicht.

Ich gebe zu, ich bin ein wenig von Ihrer Frage verwirrt. Wenn eine Behauptung Bedingung nicht erfüllt ist, wird eine Ausnahme ausgelöst. Verwirrend wird dies als AssertionError . Beachten Sie, dass diese Funktion nicht aktiviert ist, wie (zum Beispiel) Illegal , die in sehr ähnlichen Umständen geworfen wird.

Also mit Behauptungen in Java

  1. ist ein prägnanter mittels einer Bedingung / throw Block Schreiben
  2. ermöglicht es Ihnen, diese Kontrollen on / off über JVM-Parameter zu aktivieren. Normalerweise würde ich diese Kontrollen auf die ganze Zeit verlassen, es sei denn, sie Laufzeitleistung auswirken oder eine ähnliche Strafe haben.

Siehe Abschnitt 6.1.2 (Assertions im Vergleich zu anderem Fehlercode) von Sun-Dokumentation unter dem folgenden Link.

http://www.oracle.com/technetwork/articles/javase/ javapch06.pdf

Dieses Dokument gibt den besten Rat, den ich je gesehen habe auf, wenn Behauptungen zu verwenden. Zitiert aus dem Dokument:

"Eine gute Faustregel ist, dass Sie eine Assertion für Ausnahmefällen verwenden sollten, dass Sie vergessen möchte. Eine Behauptung der schnellste Weg ist, zu beschäftigen, und zu vergessen, eine Bedingung oder Zustand, dass Sie nicht erwarten, zu viel zu haben, mit. "

Leider kann behauptet deaktiviert werden. Wenn in der Produktion benötigen Sie alle Hilfe, die Sie bekommen können, wenn sie etwas, was unvorhergesehene Tracking, behauptet sich so disqualifizieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top