Was ist die richtige Fehlermeldung an Google Guava der Voraussetzungen. * Methoden zu liefern?

StackOverflow https://stackoverflow.com/questions/3128120

Frage

Zum Beispiel bei der Verwendung von

War es hilfreich?

Lösung

Für Voraussetzung Kontrollen unter Angabe der Anforderung in der Ausnahme Detailmeldung ist informativer als einfach die Tatsachen erklärt. Es führt auch zu einem viel mehr natürlich Codelese:

Die Dokumentation folgendes Beispiel vor:

  

Dies ermöglicht Konstrukte wie

 if (count <= 0) {
   throw new IllegalArgumentException("must be positive: " + count);
 }
     

mit den kompakteren

ersetzt werden
 checkArgument(count > 0, "must be positive: %s", count);

Zwei Dinge sind zu erwähnen:

  • Das Beispiel eindeutig Anforderung, eher als die Tatsache,
    • " etwas muss rechts ", anstelle von " etwas ist falsch "
  • Durch den Zustand des Kontroll invertiert, das gesamte Konstrukt mehr lesen natürlich

Im Anschluss an diesem Beispiel eine bessere Nachricht wäre:

checkArgument(a == b, "a must be equal to b"); // natural!

Sie können sogar noch einen Schritt weiter und erfassen die Werte von a und b in der Ausnahmemeldung gehen (siehe Effective Java 2nd Edition, Punkt 63: Fügen Sie Fehlererfassungs Informationen im Detail Nachrichten ):

checkArgument(a == b, "a must be equal to b; instead %s != %s", a, b);

Die Alternative Tatsachen der besagt, ist weniger natürlich in Code zu lesen:

checkArgument(a == b, "a != b");              // awkward!
checkArgument(a == b, "a is not equal to b"); // awkward!

Beachten Sie, wie umständlich es in Java-Code einen boolean Ausdruck zu lesen ist, gefolgt von einem String das widerspricht, dass die Expression.

Ein weiterer Nachteil ist, dass der besagt, Fakten für komplizierte Voraussetzungen, es ist potentiell weniger informativ, da der Benutzer bereits die Tatsache wissen kann, aber nicht das, was die tatsächlichen Anforderungen, die verletzt wird.

Verwandte Fragen

Andere Tipps

Die Dokumentation gibt Beispiele, die es sehr deutlich machen Wörter anstelle von Symbolen:

checkArgument(count > 0, "must be positive: %s", count);

Da diese sind im Grunde nur gehen Ausnahmemeldungen in Protokollen (oder Debug-Sitzungen) sein, tun, was Sie denken, wird es klarste jedem an Problem suchen, oder jemand liest den Code der Voraussetzung zu verstehen.

Zum Beispiel, Sie könnte schreiben die oben als:

checkArgument(count > 0, "count must be positive; was actually %s", count);

persönlich für so etwas denke ich, ich schreibe würde

checkArgument(a == b, "a (%s) must equal b (%s)", a, b);

Oft (die meiste Zeit) Sie können nur die Verwendung checkArgument () Methode ohne die Fehlermeldung Parameter, das heißt, nicht die Fehlermeldung an alle zu liefern.

Um eine gute Fehlermeldung braucht man machen zu verstehen, wer die Nachricht gelesen wird. Es ist nicht der Endnutzer; wenn die Voraussetzung nicht zeigt es höchstwahrscheinlich einen Fehler im Code. Der Text kann die ausgefallene Voraussetzung erklären, aber in den meisten Fällen ist es von keinerlei Nutzen für den Endverbraucher wird angenommen, ein Hinweis für den Programmierer sein. Die meiste Zeit, die Nachricht selbst macht auch keinen Sinn, ohne Stacktrace und Quellcode. In der Tat, in den meisten Fällen ein Stacktrace und Quellcode ist genau das, was ein Programmierer einen Fehler beheben muss, hat die Fehlermeldung nicht helfen. Wenn die Voraussetzung nicht offensichtlich ist, um es ein Kommentar nächstes ist ein perfekter Weg, es zu dokumentieren.

Die Notwendigkeit, immer eine Fehlermeldung in Fällen niemand wirklich kümmert sich um die Text führt zu Programmierer machen nutzlos, offensichtlich und nicht hilfreich Nachrichten liefern, die nur der Code weniger lesbar macht.

Es gibt einige Fälle, wenn eine Fehlermeldung kann nützlich sein, zum Beispiel der Nachricht, die die aktuellen Werte von Variablen enthalten, aber von unserer Erfahrung das ist nicht sehr oft, und in diesen Fällen können Sie die Nachricht verwenden.

ähnliche Argumente gelten auch in den assert Methoden in JUnit; immer eine Fehlermeldung bereitstellt, ist keine gute Idee.

Auch wenn Sie Voraussetzungen in einer Bibliothek verwenden, anstatt eine Anwendung für Endanwender, könnte es auch anders sein, da Sie nicht wissen, wie Ihr Code verwendet werden.

Wie polygenelubricants wies darauf hin:

  

Für Voraussetzung Kontrollen unter Angabe der Anforderung in der Ausnahmedetailmeldung ist informativer als einfach die Fakten unter Angabe.

Während Sie dies sicherlich mit Guava Voraussetzungen tun können, Anforderungen API (die ich verfasst) ermöglicht es Ihnen, bessere Ausgabe auf Ihrer Seite ohne Anstrengung zu erreichen.

Guava Voraussetzungen

String a = "foosball";
String b = "ballroom";
Preconditions.checkArgument(a == b, "a == b");

gibt Ihnen diese:

java.lang.IllegalArgumentException: a == b
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
    at Main.main(Main.java:142)

Anforderungen API

String a = "foosball";
String b = "ballroom";
requireThat(a, "a").isEqualTo(b, "b")

gibt Ihnen diese:

Das gleiche Eingang, eine bessere Ausgabe.

(Wenn Ihr Terminal keine Farben unterstützt, erhalten Sie eine Text diff statt)

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