Quel est le message d'erreur approprié pour fournir à Google Préalables de Goyave. * Les méthodes?

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

Question

Par exemple lors de l'utilisation

Était-ce utile?

La solution

Pour les contrôles de condition préalable, en indiquant la condition dans le message détail d'exception est plus instructif que simplement énoncer les faits. Il a également conduit à un code beaucoup plus naturellement à lire:

Le documentation fournit l'exemple suivant:

  

Cela permet à des constructions telles que

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

pour être remplacé par le plus compact

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

Deux choses sont à noter:

  • L'exemple indique clairement exigence, plutôt que le fait
    • " quelque chose doit être droite ", au lieu de " quelque chose est mauvais "
  • En inversant l'état de la vérification, la construction entière en savoir plus naturellement

Après cet exemple, un meilleur message serait:

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

Vous pouvez même aller plus loin et de capturer les valeurs de a et b dans le message d'exception (voir Effective Java 2e édition, article 63: Inclure les informations de capture de défaillance dans les messages de détail ):

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

L'alternative d'énoncer des faits est moins naturel à lire dans le code:

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

Notez comment il est difficile à lire dans le code Java une expression booléenne, suivi d'une chaîne qui contredise cette expression.

Un autre inconvénient à des faits indiquant que des conditions compliquées, il est potentiellement moins instructif, parce que l'utilisateur peut déjà connaître le fait, mais pas ce que les besoins réels sont qui est violé.

Questions connexes

Autres conseils

La documentation donne des exemples qui montrent clairement très en utilisant des mots au lieu des symboles:

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

Étant donné que ce sont fondamentalement juste vont être des messages d'exception dans les journaux (ou sessions de débogage), faites ce que vous pensez faire le plus clair à tous ceux qui cherchent à problème ou toute personne lisant le code pour comprendre la condition sine qua non.

Par exemple, pourrait réécrire ci-dessus comme:

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

Personnellement, quelque chose comme cela, je pense que j'écris

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

Souvent (la plupart du temps), vous pouvez simplement utiliser la méthode checkArgument () sans le paramètre de message d'erreur, qui est, ne fournissant pas le message d'erreur du tout.

Pour faire un bon message d'erreur dont on a besoin pour comprendre qui va lire le message. Il n'est pas l'utilisateur final; si la condition échoue, il pointe le plus probable d'un bogue dans le code. Le texte peut expliquer la condition a échoué, mais dans la plupart des cas, il est d'aucune utilité pour l'utilisateur final, il est censé être un indice pour le programmeur. La plupart du temps, le message lui-même fait également aucun sens sans code stacktrace et la source. En fait, dans la plupart des cas, un code stacktrace et la source est exactement ce qu'un programmeur a besoin de corriger un bug, le message d'erreur ne aide. Si la condition est pas évident, un commentaire à côté est un moyen idéal pour documenter.

La nécessité de toujours fournir un message d'erreur dans les cas personne ne se soucie vraiment le texte conduit à des programmeurs qui font inutiles, évidents et non des messages utiles qui ne fait que le code moins lisible.

Il y a certains cas, lorsqu'un message d'erreur peut être utile, par exemple, le message peut contenir les valeurs réelles des variables, mais de notre expérience qui est pas très souvent, et dans ces cas, vous pouvez utiliser le message.

Des arguments similaires sont également applicables dans les méthodes assert dans JUnit; toujours fournir un message d'erreur est pas une bonne idée.

En outre, lorsque vous utilisez des conditions préalables dans une bibliothèque plutôt que d'une application pour les utilisateurs finaux, les choses pourraient être différentes puisque vous ne savez pas comment votre code sera utilisé.

polygenelubricants indiqué:

  

Pour les contrôles de condition préalable, en précisant l'exigence dans le message de détail d'exception est plus instructif que simplement énoncer les faits.

Alors que vous pouvez certainement le faire avec Guava Préalables, API requise (que j'Authored) vous permet pour obtenir un meilleur rendement sans aucun effort de votre part.

Goyave Préalables

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

vous donne ceci:

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

API requise

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

vous donne ceci:

entrée même, une meilleure sortie.

(Si votre terminal ne supporte pas les couleurs, vous obtiendrez un texte diff place)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top