Las excepciones controladas están pensadas para su uso en situaciones donde un método puede esperar que su interlocutor esté preparado para tratar ciertos problemas que puedan surgir. Si los llamantes de BaseFoo.Bar()
no están obligados a tratar con un FnordException
, el método DerivedFoo.Bar()
tampoco puede esperar que sus interlocutores se ocupen de un FnordException
(ya que muchos de sus llamantes serán los mismos que no estaban preparados para tener BaseFoo.Bar()
arrojándolo).
Conceptualmente, eso es genial. En la práctica, no tanto. El problema es que el diseño de las excepciones comprobadas en el lenguaje asume que o bien las personas que llamen no estarán preparadas para tratar con elegancia un problema en particular, o bien todas las personas que llamen estarán preparadas para enfrentarlo. En la práctica, el estado normal de las cosas es que las personas que llaman no están preparadas para lidiar con las excepciones, incluso aquellas que algunas personas que llaman podrían ser capaces de manejar. La mayoría de las veces, el curso de acción apropiado cuando el código recibe una excepción comprobada que no espera explícitamente sería envolverlo en una excepción sin marcar y arrojar eso. Irónicamente, el curso de acción más fácil - agregar una cláusula de "lanzamientos" y permitir que la excepción marcada suba, es probablemente la menos probable que sea correcta. Si bien hay algunos casos (por ejemplo, IOException
) donde tal comportamiento tendría sentido (por ejemplo, al intentar leer una colección de un archivo, un error de E/S al leer un elemento es un error de E/S al leer la colección), La excepción lanzada desde una llamada a método anidado representará una condición diferente de la que tendrá una excepción del mismo tipo arrojado por el método externo, y el código que estaría preparado para manejar este último puede no estar preparado para manejar el primero.
En su situación, su mejor opción es capturar IOException
y envolverlo en otro tipo que se deriva de RuntimeException
, teniendo en cuenta que es poco probable que las personas que llaman puedan manejarlo.
Por favor, muéstrenos el código completo que demuestra el problema. Incluyendo también el nombre de clase completamente calificado para su 'Excepción' (s). –
¿Puedes mostrar un poco más de tu código y el error exacto que estás obteniendo? – aniri
La mina funciona. Deberías mostrarnos más código que eso. – Averroes