practices practice handling good exceptions custom catch best java exception architecture

practice - java exceptions list



¿Cómo deberían planificarse las excepciones a nivel arquitectónico? (4)

¿Existen buenos recursos para planificar cómo se usarán las excepciones desde la perspectiva de la arquitectura? (O brinde sus sugerencias directamente aquí). En proyectos en los que he trabajado, encuentro que algunas excepciones comunes se usan una y otra vez y tienden a perder su significado. De: http://jamesjava.blogspot.com/2007/10/exception-plan.html


Intento asegurarme de que la cantidad de lugares que usan try / finally supera en gran medida la cantidad de lugares que usan try / catch. catch generalmente se reserva para capturar excepciones en el nivel superior, donde pueden manejarse con sensatez o lidiar con excepciones de las API de la plataforma.

En este caso, siempre que dé excepciones a los mensajes significativos y cadenas de excepciones cuando sea necesario, no ser capaz de identificar una excepción por su clase no es una gran pérdida. A menudo lanzo RuntimeException en lugar de tratar de desarrollar una clase de excepción para cada caso de error concebible, pero su opinión sobre eso dependerá de dónde se siente en el debate de la excepción marcada contra la desactivada.


Estoy casi de acuerdo con el comentario de Apocalisp. Las instancias de excepción deben reservarse para los casos en que se haya producido un error de procesamiento o de datos, pero se pueden recuperar mediante la intervención del usuario o del sistema. Las instancias de RuntimeException deben reservarse para aquellas ocasiones en que ninguna intervención dentro de los límites de su aplicación puede resolver el problema. Estos dos tipos se conocen, por lo tanto, como excepciones Controladas y Desmarcadas.

Un ejemplo de excepciones sin marcar sería si un recurso físico (como una base de datos o un bus de mensajes) no está disponible. Una RuntimeException es buena en este caso porque no está planeando que el recurso no esté disponible, por lo que su lógica de negocio no tiene que verificar constantemente la excepción DatabaseUnavailable, o algo similar. Puede manejar RuntimeExceptions de una manera diferente (tal vez AOP enviando un correo electrónico) para informar la interrupción y permitir que el personal o el soporte solucionen el problema físico.

Ejemplos de excepciones comprobadas serían la entrada deficiente de datos o el acceso a datos incompletos, o algo que en realidad no funciona, pero puede verificarse y recuperarse. Un ejemplo de esto podría ser que un Usuario que ha buscado no está disponible. Es una condición separada en su lógica de negocio que puede ser revisada y manejada (por ejemplo, en la parte Vista de su aplicación que luego informa el mensaje de la Excepción como un mensaje de error para el Usuario).

Muchos frameworks usan este modelo y parece funcionar mejor de lo que he visto.

Dicho esto, muchos reemplazan las excepciones comprobadas con nulos devueltos, -1, cadena vacía o Number.MIN_VALUE. Si bien esto está bien, si no está esperando rutinariamente estos valores de un origen de datos o método, probablemente debería representarse como una excepción.


En general, me parece que obsesionarse con las excepciones comprobadas es excesivo. Las excepciones deben reservarse para las condiciones de error inesperadas de las cuales el programa no puede recuperarse razonablemente. Para estos, tiendo a estar de acuerdo con lo que has observado, que los tipos de error especiales tienden a perder su significado.

Como regla general, lanza una excepción cuando todos los siguientes son verdaderos:

  • La condición no se puede recuperar desde aquí.
  • No se puede esperar razonablemente que la persona que llama se recupere de esta condición.
  • Alguien querrá depurar la situación, por lo que es posible que desee ver el seguimiento de la pila.

Descubrirá que si todos estos son verdaderos, el tipo de excepción no es importante, y también puede lanzar java.lang.Error. Si alguno de ellos es falso, entonces una excepción probablemente sea excesiva (¿realmente necesita el tipo, el mensaje y el seguimiento de la pila?)

En su lugar, considere aumentar el tipo de método de devolución para indicar tipos esperados de falla. Por ejemplo, use un tipo de opción <A> para los métodos en los que puede tener sentido no devolver ningún valor en algunos casos. Utilice un tipo Cualquiera de <A, B> para los métodos en los que es posible que deba devolver un valor cuyo tipo depende de la falla o el éxito. Donde antes podría haber tenido subtipos de Excepción especializados, puede usar en su lugar <Fail, A> donde Fail es solo una enumeración de los tipos de fallas que se esperan.


"Java efectivo", 2do. ed. Bloch , tiene buenos consejos en el capítulo 9.

"Hardcore Java", Simmons , tiene algunos buenos consejos en el capítulo 5.

También mencionaré desvergonzadamente que he escrito una pequeña herramienta para administrar el código fuente de excepción de Java. El código de excepción a menudo es muy redundante, todo lo que generalmente le importa es el tipo. Mi herramienta acepta un archivo de configuración que nombra tipos de excepción y luego genera código para esas excepciones.