Pregunta

La mayoría del tiempo lo voy a utilizar una excepción para detectar una enfermedad en mi código, me pregunto cuándo es el momento apropiado para utilizar 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ías indicar cómo una afirmación cabe aquí?Debo usar una afirmación?

Parece que nunca use afirmaciones contenidas en el código de producción y sólo ven afirmaciones en las pruebas unitarias.Hago saber que en la mayoría de los casos, puedo usar excepción a hacer la comprobación de arriba, pero quiero saber la manera adecuada de hacerlo "profesionalmente".

¿Fue útil?

Solución

Las afirmaciones deben ser utilizados para comprobar algo que nunca debe suceder, mientras que una excepción se debe utilizar para comprobar algo que podría suceder.

Por ejemplo, una función puede dividir por 0, por lo que es conveniente dejar sin utilizar, pero una afirmación podría ser utilizado para verificar que el disco duro desaparece de repente.

Una afirmación se detendría el programa se ejecute, pero una excepción sería dejar que el programa continuará funcionando.

Tenga en cuenta que if(group != null) no es una afirmación, que es sólo un condicional.

Otros consejos

Fuera de mi mente (la lista puede ser incompleta, y es demasiado largo para caber en un comentario), yo diría:

  • el uso de excepciones cuando la comprobación de los parámetros pasados a la información pública o protegida métodos y constructores
  • el uso de las excepciones a la hora de interactuar con el usuario o cuando se espera que el código de cliente para recuperarse de una situación excepcional
  • el uso de excepciones para abordar los problemas que puedan surgir
  • el uso de afirmaciones cuando la comprobación de pre-condiciones post-condiciones y los invariantes de privado/código interno
  • el uso de afirmaciones para proporcionar retroalimentación a ti o a tu equipo de desarrolladores
  • el uso de afirmaciones cuando la comprobación de cosas que son muy poco probable que suceda lo contrario, significa que hay un grave error en su aplicación
  • el uso de afirmaciones para el estado de cosas que (supuestamente) saben que es verdad

En otras palabras, las excepciones dirección de la robustez de la aplicación mientras afirmaciones de la dirección a su corrección.

Las afirmaciones que están diseñados para ser barato para escribir, usted las puede utilizar en casi todas partes y estoy usando esta regla de oro:más una afirmación afirmación parece estúpida, la más valiosa es y más información que se incrusta.Cuando se depura un programa que no se comportan de la manera correcta, usted seguramente va a comprobar el más evidente ausencia de posibilidades basadas en su experiencia.Entonces usted va a comprobar si hay problemas que no puede suceder:esto es exactamente cuando las afirmaciones son de mucha ayuda y ahorrar tiempo.

Recuerde afirmaciones se pueden desactivar en tiempo de ejecución utilizando los parámetros, y son desactivados por defecto , así que no contar con ellos, excepto para fines de depuración.

También debería leer el artículo Oracle sobre afirman para ver más casos en los que el uso - o no de usar -. aserción

Como regla general:

  • El uso de aserciones para comprobaciones de coherencia interna donde no importa en absoluto si alguien los desactiva.(Tenga en cuenta que el java comando desactiva todas las aseveraciones de forma predeterminada).
  • El uso regular de pruebas para cualquier tipo de comprobaciones de lo que no debe estar apagado.Este incluye a la defensiva, se comprueba que protegerse contra posibles daños producidos por los insectos, y la validación de datos / peticiones / lo que sea facilitada por los usuarios o servicios externos.

El siguiente código de tu pregunta está mal estilo y potencialmente buggy

try {
    group = service().getGroup("abc");
} catch (Exception e) {
    //i dont log error because i know whenever error occur mean group not found
}

El problema es que NO sabes que una excepción significa que el grupo no se ha encontrado.También es posible que el service() llame lanzó una excepción, o que sea devuelto null que provocó una NullPointerException.

Cuando se captura una "espera" de excepción, debe captar sólo la excepción de que usted está esperando.Por la captura java.lang.Exception (y, especialmente, por no registrar), están haciendo que sea más difícil de diagnosticar / depurar el problema, y lo que potencialmente permite la aplicación para hacer más daño.

De acuerdo con este documento http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general , "La sentencia assert es apropiado para precondición no pública, y postcondition invariante de clase de cheques. comprobación de condición previa Pública todavía debe ser realizada por los controles dentro de los métodos que resultan, en particular, las excepciones documentadas, tales como IllegalArgumentException y IllegalStateException ".

Si desea saber más acerca de condición, condición posterior y la invariante de clase, consulte este documento: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . También contiene con ejemplos de uso afirmaciones.

Bueno, de vuelta a Microsoft, la recomendación era lanzar excepciones en todas las API se ponen a disposición pública y utilización Afirma en todo tipo de supuestos que tome acerca de código que es interno. Es un poco de una definición poco precisa pero supongo que depende de cada desarrollador para dibujar la línea.

En cuanto a la utilización de excepciones, como su nombre lo dice, su uso debe ser excepcional por lo que para el código que presente por encima, la llamada debe devolver getGroup null si no existe ningún servicio. Excepción sólo debería ocurrir si un enlace de red se cae o algo por el estilo.

Creo que la conclusión es que es un poco a la izquierda hacia el equipo de desarrollo para cada aplicación para definir los límites de la aserción vs excepciones.

Las pruebas para nula sólo se cogerá nulos que causan problemas, mientras que un try / catch como lo tienes cogerá cualquier de error.

En términos generales, try / catch es más seguro, pero ligeramente más lento, y hay que tener cuidado de que se captura todos los tipos de errores que pueden ocurrir. Así que yo diría uso try / catch -. Un día el código getGroup puede cambiar, y que sólo podría necesitar esa red más grande

Puede utilizar esta simple diferencia en cuenta al mismo tiempo su uso. Las excepciones serán utilizados para la comprobación de errores y espera que los errores inesperados llamados marcado y sin marcar, mientras que la afirmación se utiliza principalmente para fines de depuración en el tiempo de ejecución para ver si los supuestos son validados o no.

Confieso que estoy un poco confundido por su pregunta. Cuando una condición afirmación no se cumple, se produce una excepción. Confusamente esto se llama AssertionError . Tenga en cuenta que no está marcada, como (por ejemplo) IllegalArgumentException que se lanza en circunstancias muy similares.

Así que usando afirmaciones en Java

  1. es un medio más concisas de escribir un bloque de estado / tiro
  2. le permite convertir estos controles de encendido / apagado a través de parámetros de JVM. Normalmente me gustaría dejar estos controles sobre todo el tiempo, a menos que afectar al rendimiento en tiempo de ejecución o tienen una penalización similar.

Vea la sección 6.1.2 (Las afirmaciones frente a 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 da el mejor consejo que he visto sobre cuándo utilizar afirmaciones. Citando el documento:

"Una buena regla general es que usted debe utilizar una afirmación para los casos excepcionales que le gustaría olvidar. Una afirmación es la forma más rápida de tratar, y olvidar, una condición o estado que usted no espera a tener que hacer frente a ".

Desafortunadamente asevera puede ser desactivado. Cuando en la producción que necesita toda la ayuda que puede obtener cuando se esté rastreando algo imprevisto, por lo que afirma descalificar a sí mismos.

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