Cuándo elegir excepciones marcadas y no marcadas
En Java (o cualquier otro lenguaje con excepciones marcadas), al crear su propia clase de excepción, ¿cómo decide si debe marcarla o desmarcarla?
Mi instinto es decir que se requeriría una excepción marcada en los casos en que la persona que llama podría recuperarse de alguna manera productiva, mientras que una excepción no marcada sería más para casos irrecuperables, pero me interesaría conocer las opiniones de los demás.
Las excepciones marcadas son excelentes, siempre que comprenda cuándo deben usarse. La API principal de Java no sigue estas reglas para SQLException (y a veces para IOException), por lo que son tan terribles.
Las excepciones marcadas se deben utilizar para errores predecibles , pero inevitables, de los que es razonable recuperarse .
Las excepciones no marcadas deben usarse para todo lo demás.
Te explicaré esto porque la mayoría de la gente no entiende lo que esto significa.
- Predecible pero inevitable : la persona que llama hizo todo lo que estuvo a su alcance para validar los parámetros de entrada, pero alguna condición fuera de su control provocó que la operación fallara. Por ejemplo, intenta leer un archivo pero alguien lo elimina entre el momento en que verifica si existe y el momento en que comienza la operación de lectura. Al declarar una excepción marcada, le está diciendo a la persona que llama que anticipe este error.
- Razonable para recuperarse : no tiene sentido decirle a las personas que llaman que anticipen excepciones de las que no podrán recuperarse. Si un usuario intenta leer un archivo que no existe, la persona que llama puede solicitarle un nuevo nombre de archivo. Por otro lado, si el método falla debido a un error de programación (argumentos de método no válidos o implementación de método defectuosa) no hay nada que la aplicación pueda hacer para solucionar el problema a mitad de la ejecución. Lo mejor que puede hacer es registrar el problema y esperar a que el desarrollador lo solucione más adelante.
A menos que la excepción que está lanzando cumpla con todas las condiciones anteriores, debería utilizar una excepción no marcada.
Reevaluar en todos los niveles : a veces, el método que detecta la excepción marcada no es el lugar adecuado para manejar el error. En ese caso, considere lo que es razonable para sus propias personas que llaman. Si la excepción es predecible, inevitable y razonable para que se recuperen, entonces usted mismo debe lanzar una excepción marcada. De lo contrario, debe envolver la excepción en una excepción no marcada. Si sigue esta regla, se encontrará convirtiendo excepciones marcadas en excepciones no marcadas y viceversa, dependiendo de la capa en la que se encuentre.
Para excepciones marcadas y no marcadas, utilice el nivel de abstracción correcto . Por ejemplo, un repositorio de código con dos implementaciones diferentes (base de datos y sistema de archivos) debe evitar exponer detalles específicos de la implementación lanzando SQLException
o IOException
. En cambio, debería envolver la excepción en una abstracción que abarque todas las implementaciones (p. ej. RepositoryException
).
De un estudiante de Java :
Cuando ocurre una excepción, debe detectar y manejar la excepción, o decirle al compilador que no puede manejarla declarando que su método arroja esa excepción, entonces el código que usa su método tendrá que manejar esa excepción (incluso si también puede optar por declarar que lanza la excepción si no puede manejarla).
El compilador comprobará que hemos hecho una de las dos cosas (capturar o declarar). Por eso se denominan excepciones comprobadas. Pero el compilador no verifica los errores y las excepciones de tiempo de ejecución (aunque puede elegir capturarlos o declararlos, no es obligatorio). Entonces, estas dos se denominan excepciones no comprobadas.
Los errores se utilizan para representar aquellas condiciones que ocurren fuera de la aplicación, como una falla del sistema. Las excepciones en tiempo de ejecución generalmente ocurren por fallas en la lógica de la aplicación. No puedes hacer nada en estas situaciones. Cuando ocurre una excepción en tiempo de ejecución, debe volver a escribir el código de su programa. Por lo tanto, el compilador no los verifica. Estas excepciones de tiempo de ejecución se descubrirán durante el período de desarrollo y prueba. Luego tenemos que refactorizar nuestro código para eliminar estos errores.