La mayoría de las veces usaré una excepción para verificar una condición en mi código, me pregunto cuándo es el momento apropiado para usar una afirmación.
Por ejemplo,
Group group=null;
try{
group = service().getGroup("abc");
}catch(Exception e){
//I dont log error because I know whenever error occur mean group not found
}
if(group !=null)
{
//do something
}
¿Podría indicar cómo encaja una aserción aquí? ¿Debo usar una afirmación?
Parece que nunca uso aserciones en el código de producción y solo veo aserciones en pruebas unitarias. Sé que en la mayoría de los casos, solo puedo usar la excepción para hacer la verificación como se indicó anteriormente, pero quiero saber la forma adecuada de hacerlo "profesionalmente".
Fuera de mi mente (la lista puede estar incompleta y es demasiado larga para caber en un comentario), diría:
En otras palabras, las excepciones abordan la solidez de su aplicación, mientras que las aserciones abordan su corrección.
Las afirmaciones están diseñadas para ser baratas de escribir, puedes usarlas en casi todas partes y estoy usando esta regla general: cuanto más estúpida es una declaración de afirmación, más valiosa es y más información incorpora. Al depurar un programa que no se comporta de la manera correcta, seguramente verificará las posibilidades de falla más obvias según su experiencia. Luego verificará los problemas que simplemente no pueden suceder: esto es exactamente cuando las afirmaciones ayudan mucho y ahorran tiempo.
fuente
Recuerde que las aserciones pueden deshabilitarse en tiempo de ejecución utilizando parámetros, y están deshabilitadas de manera predeterminada , por lo que no cuente con ellas excepto para fines de depuración.
También debe leer el artículo de Oracle sobre afirmación para ver más casos en los que utilizar, o no utilizar, la afirmación.
fuente
Como regla general:
java
comando desactiva todas las aserciones de forma predeterminada).El siguiente código de su pregunta tiene un estilo incorrecto y puede presentar errores.
El problema es que NO sabe que una excepción significa que no se encontró el grupo. También es posible que la
service()
llamada haya arrojado una excepción, o que haya regresado, lonull
que causó unNullPointerException
.Cuando detecta una excepción "esperada", debe detectar solo la excepción que está esperando. Al detectar
java.lang.Exception
(y especialmente al no iniciar sesión), está haciendo que sea más difícil diagnosticar / depurar el problema, y potencialmente permitiendo que la aplicación haga más daño.fuente
Bueno, de vuelta en Microsoft, la recomendación era lanzar Excepciones en todas las API que pongas a disposición del público y usar Asserts en todo tipo de suposiciones que hagas sobre el código interno. Es una definición un poco floja, pero supongo que depende de cada desarrollador dibujar la línea.
Con respecto al uso de Excepciones, como su nombre lo indica, su uso debe ser excepcional, por lo que para el código que presenta anteriormente, la
getGroup
llamada debería regresarnull
si no existe ningún servicio. La excepción solo debería ocurrir si un enlace de red se cae o algo así.Supongo que la conclusión es que queda un poco en manos del equipo de desarrollo para que cada aplicación defina los límites de afirmación frente a excepciones.
fuente
De acuerdo con este documento http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general , "La declaración de aserción es apropiada para la condición previa no pública, la condición posterior y la clase invariante "La comprobación de la condición previa pública aún debe realizarse mediante comprobaciones dentro de los métodos que dan como resultado excepciones documentadas en particular, como IllegalArgumentException e IllegalStateException".
Si desea obtener más información sobre la condición previa, la condición posterior y la clase invariante, consulte este documento: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . También contiene ejemplos de uso de aserciones.
fuente
La prueba de nulo solo detectará nulos que causan problemas, mientras que un intento / captura como lo hace detectará cualquier error.
En términos generales, try / catch es más seguro, pero un poco más lento, y debe tener cuidado de detectar todos los tipos de error que pueden ocurrir. Entonces diría que use try / catch: un día el código getGroup puede cambiar, y es posible que necesite esa red más grande.
fuente
Puede usar esta simple diferencia en mente mientras usa. Las excepciones se usarán para verificar los errores esperados e inesperados llamados errores verificados y no verificados, mientras que la aserción se usa principalmente con fines de depuración en el tiempo de ejecución para ver si los supuestos están validados o no.
fuente
Confieso que estoy un poco confundido por tu pregunta. Cuando no se cumple una condición de aserción, se lanza una excepción. Confusamente esto se llama AssertionError . Tenga en cuenta que no está marcada, como (por ejemplo) IllegalArgumentException, que se produce en circunstancias muy similares.
Entonces, usando aserciones en Java
fuente
Consulte la sección 6.1.2 (Aserciones versus otro código de error) de la documentación de Sun en el siguiente enlace.
http://www.oracle.com/technetwork/articles/javase/javapch06.pdf
Este documento ofrece los mejores consejos que he visto sobre cuándo usar aserciones. Citando del documento:
"Una buena regla general es que debes usar una afirmación para casos excepcionales de los que te gustaría olvidarte. Una afirmación es la forma más rápida de lidiar y olvidar una condición o estado que no esperas tener que tratar con."
fuente
Lamentablemente afirma puede ser deshabilitado. Cuando esté en producción, necesita toda la ayuda que pueda obtener al rastrear algo imprevisto, por lo que afirma descalificarse.
fuente