usuario todas propagacion por personalizadas new manage lista las jerarquía generar exceptions excepciones excepcion empty ejemplos definidas definicion catch java exception interface throw

propagacion - todas las excepciones en java



Lanzar una excepción no definida en la interfaz (6)

¿Cuál es la mejor práctica a seguir cuando necesita lanzar una excepción que no se definió en una interfaz que está implementando?

Aquí hay un ejemplo:

public interface Reader { public abstract void read() throws IOException; } public class CarrotReader implements Reader { public void read() throws IOException {} } public class CupcakeReader implements Reader { public void read() throws IOException, CupcakeException {} }

En este caso, tiene una excepción específica que se produce al leer pastelitos, por lo que desea lanzar una excepción relacionada con esto. Sin embargo, Reader no define este tipo de excepción en su interfaz, entonces, ¿qué hace usted? Además, no tiene sentido agregar CupcakeException a la cláusula de lanzamientos en la interfaz del Lector , porque este tipo de excepción es específica de CupcakeReader . Una forma de evitar esto es hacer que el lector defina la lectura de tal manera que arroje algún tipo de padre, como Excepción , pero luego se pierde el contexto para la excepción. ¿Qué debes hacer en esta situación? ¡Gracias!

Otra situación interesante que se ha planteado es una interfaz sobre la que no tiene control. En este caso, ¿cuál es la mejor manera de indicar que se ha producido un problema?

Para propósitos ilustrativos, aquí hay otro ejemplo:

public interface Reader { public abstract void read(); } public class CupcakeReader implements Reader { public void read() throws CupcakeException {} }

En este caso, no puede cambiar Reader , pero desea indicar que se ha producido un problema con el método de lectura de CupcakeReader .


La excepción es parte de la interfaz. Defina un padre genérico para todas sus excepciones en la interfaz si puede redefinir la interfaz.

También puede hacer que CupcakeException sea un hijo de IOException.


Puede que tenga que crear una excepción del tipo esperado en su lugar.

... catch(CupcakeException e) { throw new IOException("The sky is falling", e); }


Quizás podría hacer una clase abstracta de ReaderSpecificException, ponerla en la Interfaz, y la subclase CupcakeException de esta clase abstracta.


Si crea una excepción abstracta superior que funciona como una clase base para CupCakeException, no vinculará la Interfaz del Lector a una implementación específica como lo haría si agregara la CupCakeException a la interfaz del Lector. Si no dejas que una Excepción herede de otra, hay un constructor en la clase de excepción que toma un segundo argumento como Thorbjørn Ravn Andersen que ya se muestra en su ejemplo de código corto. Le permite generar una excepción más abstracta y cada parte de su código que necesita saber más que simplemente "hay un error" puede buscar la causa de la excepción más alta.


Utilice algo llamado ReaderException que servirá como interfaz raíz de su jerarquía de excepciones. ReaderException también proporciona un enlace a otras excepciones que se lanzan debido a excepciones de nivel inferior.


Simplemente no use excepciones marcadas.

El ejemplo que mostró es una de las razones por las que las excepciones marcadas son malas.

Sin embargo, la razón principal es que el usuario de su lector de cupcake tendrá que manejar su excepción, independientemente de si está interesado en ella o no.

Así que en lugar de:

Value value = reader.read();

Le estás obligando a hacer esto:

Value value = null; try { value = reader.read(); } catch (Exception e) { // now what?? } value.doSomething(); // potential NPE here

Piense cuál es mejor, más legible y menos propenso a errores y simplemente deje de usar las excepciones marcadas.

EDITAR:

Estoy sorprendido con la calificación negativa. ¿Hay personas que todavía piensan que las excepciones marcadas son excelentes? Si es así, aquí hay algunas referencias por las que no debería usar excepciones marcadas:

  • Ningún marco moderno utiliza excepciones comprobadas (Spring, EJB3, etc.)
  • Artículo con ejemplos de código here
  • topic
  • Java efectiva (secciones 58 y 59) - here