¿Cuál es el mensaje de error adecuado para abastecer a las condiciones previas de Google guayaba. * Métodos?

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

Pregunta

Por ejemplo cuando se utiliza Preconditions.checkArgument , es el mensaje de error supone para reflejar el caso de cruce o el caso en su defecto del cheque en cuestión?

import static com.google.common.base.Preconditions.*;

void doStuff(int a, int b) {
  checkArgument(a == b, "a == b");
  // OR
  checkArgument(a == b, "a != b");
}
¿Fue útil?

Solución

Para los cheques condición previa, indicando el requisito en el mensaje de detalle excepción es más informativo que simplemente indicando los hechos. También conduce a una gran cantidad de forma más natural de lectura de códigos:

El documentación ofrece el siguiente ejemplo:

  

Esto permite construcciones tales como

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

ser reemplazado con el más compacto

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

Dos cosas son de nota:

  • El ejemplo indica claramente requisito, más que el hecho de
    • " algo debe ser derecho ", en lugar de " algo es mal "
  • invirtiendo la condición del cheque, todo el constructo leer más naturalmente

Siguiendo ese ejemplo, un mensaje mejor sería:

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

Usted puede incluso ir un paso más allá y capturar los valores de a y b en el mensaje de excepción (ver A partir de Java 2ª edición, artículo 63: Incluir la información de captura de fallo en los mensajes detalle ):

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

La alternativa de afirmar hechos es menos natural a leer en código:

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

Nota lo incómodo que es leer en código Java una expresión booleana, seguido de una cadena que contradice esa expresión.

Otra desventaja de los hechos que indican es que para condiciones complicadas, es potencialmente menos informativo, ya que el usuario puede saber ya del hecho, pero no lo son que se está violando los requisitos reales.

preguntas relacionadas

Otros consejos

La documentación da ejemplos que dejan muy claro el uso de palabras en lugar de símbolos:

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

Teniendo en cuenta que estos son, básicamente, sólo van a ser mensajes de excepción en los registros (o sesiones de depuración), hacer lo que crees que va a hacer que sea más claro para cualquiera que busque en un problema, o cualquiera que lea el código para entender la condición previa.

Por ejemplo, podría reescribir lo anterior como:

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

En lo personal, para algo como esto creo que me gustaría escribir

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

A menudo (la mayor parte del tiempo) sólo se puede utilizar el método checkArgument () sin el parámetro de mensaje de error, es decir, que no hayan entregado el mensaje de error en absoluto.

Para hacer un buen mensaje de error hay que entender que va a leer el mensaje. No es el usuario final; si falla la condición previa que apunta muy probablemente a un error en el código. El texto puede explicar la condición previa fallado, pero en la mayoría de los casos es de ninguna utilidad para el usuario final, que se supone que es un indicio para el programador. La mayoría de las veces, el mensaje por sí mismo también no tiene sentido sin un código StackTrace y la fuente. De hecho, en la mayoría de los casos, un código fuente StackTrace y es exactamente lo que un programador necesita para corregir un error, el mensaje de error no ayuda. Si la condición no es evidente, un comentario al lado de él es una manera perfecta de documentarla.

La necesidad de suministrar siempre un mensaje de error en los casos en realidad nadie se preocupa por los cables de texto a los programadores haciendo mensajes inútiles, obvias y no votos, que sólo hace que el código sea menos legible.

Hay algunos casos, cuando un mensaje de error puede ser útil, por ejemplo, el mensaje puede contener los valores reales de las variables, pero por nuestra experiencia que no es muy a menudo, y en estos casos se puede utilizar el mensaje.

Argumentos similares se aplican también en los métodos de aserción en JUnit; siempre proporcionando un mensaje de error no es una buena idea.

Además, cuando se está utilizando condiciones previas en una biblioteca en lugar de una aplicación para los usuarios finales, las cosas podrían ser diferentes ya que no se sabe cómo se utilizará el código.

polygenelubricants señalado:

  

Para los cheques condición previa, que indica el requisito establecido en el mensaje de detalle excepción es más informativo que simplemente indicando los hechos.

Mientras que usted puede hacer esto con guayaba condiciones previas, Requisitos API (que fui autor) que permite para lograr una mejor salida sin ningún esfuerzo de su parte.

Las condiciones previas de guayaba

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

le da esto:

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

Requisitos API

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

le da esto:

de salida

misma entrada, una mejor salida.

(Si su terminal no soporta colores, obtendrá un texto diff en su lugar)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top