2010-07-25 17 views
6

Siempre controlo los argumentos de las funciones públicas y lanzo excepciones cuando algo anda mal. (Para ayudantes privados, uso aserciones).¿Mensaje de excepción IllegalArgumentException automatizado?

De esta manera:

if(a < 0 || a >= b) 
    throw new IllegalArgumentException("'a' must be greater or equal to 0 and 
     smaller than b "); 

Pero siempre me molesta para escribir estos mensajes de error. El mensaje me parece redundante, ya que el mensaje es solo la negación de la declaración

a < 0 || a >= b 

.

También sucede a menudo que cambio el nombre de la variable con la refactorización (en eclipse) y luego el mensaje no refleja los cambios. O cambio las condiciones y me olvido de cambiar los mensajes.

Sería muy bueno, si podría escribir algo como:

assertArgument(a >= 0 && a < b); 

Esto debería plantear una IllegalArgumentException con un mensaje como

"violated argument assertion: a >= 0 && a < b." 

En C se podría escribir una macro (en realidad en C assert es solo una macro). ¿Hay alguna manera simple de hacer algo como esto en Java?

¡Gracias!

+0

Puede generar código Java durante la construcción ... pero el dolor no vale la pena. Tu problema no es mortal, siempre que puedas identificar una línea, estarás bien. También puede escribir un script de Python para revisar el código y verificar si hay inconsistencias. –

+1

¿Qué le parece crear una función auxiliar 'checkParam (param, paramName)'? Luego, incluso después de cambiar el nombre de las variables, aún puede instalar una secuencia de comandos rápida de Python para buscar todas las instancias de checkParam y asegurarse de que sean kosher. Quizás alguien más pueda ampliar esta idea. –

+0

Incluso podría usar la reflexión en el modo de depuración. –

Respuesta

3

En el lenguaje C no puedes usar macros para hacer esto, pero en cpp (el preprocesador C) puedes :-) Si realmente quieres hacerlo, no hay nada que te impida ejecutar cpp en tu fuente java antes se compila Eso le permitiría usar macros de estilo cpp (puede necesitar quitar las líneas comenzando con #line desde la salida cp).

Para reproducir el condicional en la excepción está en mi humilde opinión la inclusión de demasiados detalles de implementación. Si su mensaje de excepción describe la violación en el contrato en términos del contrato (por ejemplo, "no se entregó ningún objeto principal", "la cantidad no puede ser negativa"), no necesita cambiarlo cada vez que cambie la condición.

+0

Tiene razón sobre el preprocesador, pero consideraría el preprocesador C como parte de la programación C. Las declaraciones de preescritor no son realmente parte del lenguaje C, ya que el compilador de C nunca llega a verlas, pero son realmente esenciales para escribir C. –

+0

Y gracias por las sugerencias: usar un preprocesador o ejecutar un Scipt (como sugirió Hamish Grubijan) para cambiar o verificar el código, podría resolver mi problema (realmente no tan letal). Aunque pensé más en una solución Java simple y nativa, ya que también es importante que otras personas entiendan claramente lo que está sucediendo.Por otra parte, podría compartir solo el código generado ... ¿Podría quizás Design by Contract ayudarme? No tengo experiencia con DbC hasta ahora. –

+0

Si está buscando en los preprocesadores, es posible que desee examinar M4 (http://www.gnu.org/software/m4/) DbC puede ayudar, pero normalmente no ejecutará el código instrumentado en producción. Debido a que su requisito es uno de una secuencia de comandos perl o python que corrige su argumento de excepción es probablemente la forma más rápida de hacerlo. – rsp

Cuestiones relacionadas