Contratos vs excepciones
Pregunta
Supongamos que tengo el siguiente código:
public class MainClass {
public static void main(String[] args) {
System.out.println(sumNumbers(10, 10));
}
//@requires a >= 10;
//@ensures \result < 0;
public static int sumNumbers(int a, int b) {
return a+b;
}
}
Puedo hacer 2 cosas aquí:
Utilice contratos de código (en este caso, lo que está en los comentarios).Cuando se ejecuta sumNumbers y < 10, se generará inmediatamente una excepción (aunque no parece ser muy descriptivo):
Exception in thread "main" org.jmlspecs.jmlrac.runtime.JMLInternalNormalPostconditionError: by method MainClass.sumNumbers
at MainClass.sumNumbers(MainClass.java:500)
at MainClass.internal$main(MainClass.java:9)
at MainClass.main(MainClass.java:286)
o...
Lanza una excepción.La excepción puede ser tan descriptiva como quiera.También me gustaría verificar el final de la función para ver si las condiciones de la publicación son verdaderas o no.
¿Cuál usarías aquí y por qué?
Solución
Me gusta la idea de los contratos de código, pero el IllegalArgumentException
descriptiva (o similar) consejos para mí. Es mucho más clara en un papel de apoyo / producción (o incluso un desarrollo) para obtener un mensaje de excepción explícita, lo que le da una ventaja en el diagnóstico lo que va mal (si un sistema está roto, o si está mal uso de una API durante el desarrollo ).
Otros consejos
¿Espera que se pasen entradas no válidas a este argumento durante el funcionamiento normal de su programa?Si es así, ¿puedes recuperarte de ello?
Si es así, las excepciones marcadas son el camino a seguir.
Si no puede recuperarse de este tipo de caso, entonces conviértalo en un contrato y falle estrepitosamente, pero en cualquier caso usaría un mensaje de error descriptivo.