En mi empresa, estamos construyendo una aplicación web que contiene varios servicios centrales que diseñamos nosotros mismos y luego especificamos como interfaces. Es decir, las interfaces son específicas de la aplicación y luego se implementan con bibliotecas de terceros que podemos cambiar con el tiempo. Cuando se trata de excepciones, me he dado cuenta de que las excepciones lanzadas por nuestros servicios deberían ser nuestras propias excepciones específicas de la aplicación en lugar de las excepciones específicas de la implementación.
Ahora, me pregunto cómo deberían estructurarse y relacionarse nuestras excepciones.
Primero, considere una excepción genérica MyAppException
. Esta excepción indica que algo inesperado salió mal y lo mejor que podemos hacer es mostrar un mensaje al usuario diciendo que algo salió mal y que estamos trabajando en ello. El error podría ser que la base de datos se bloqueó o algo similar. Esta excepción se lanzaría prácticamente desde todos los métodos que trabajan con la base de datos.
En segundo lugar, considere una excepción MyAppDuplicateException
. Esta excepción indicaría que el usuario intentó guardar algo en la base de datos que ya estaba allí. Aquí, podemos mostrar un mensaje de error mucho más específico y esta excepción solo se genera desde los métodos que insertan o actualizan las filas de la base de datos.
La aplicación también puede contener otras excepciones similares a MyAppDuplicateException
otras situaciones de error esperadas. Ex MyAppNotFoundException
etc ...
Ahora a mis preguntas:
- ¿Deberían extenderse las otras excepciones
MyAppException
? En realidad no veo ninguna razón para esto, lo acabo de ver en muchos lugares y me pregunto si tiene un propósito. La desventaja de esto, como lo veo, es que una declaración try / catch no necesita preocuparse por la excepción específica en este caso. Simplemente puede detectar la excepción principal y, debido a esto, no necesita manejar el error específico, que era prácticamente el punto de tener la excepción específica. - Si las otras excepciones no se extienden
MyAppException
, ¿deberíaMyAppException
ser unjava.lang.RuntimeException
? Esto no requeriría el código de ejecución para atraparlo, lo que para mí suena natural ya que el punto de la excepción es decir que sucedió algo desconocido y no se espera que el código de ejecución pueda manejarlo. El código en el punto de entrada de la solicitud aún podría tener una declaración try / catch que detectaMyAppException
y asegura que se muestra un mensaje al usuario.
editar No hay duda de si las excepciones específicas como MyAppDuplicateException
deberían verificarse o no, deberían verificarse definitivamente.
fuente
IOException
debería ser una excepción de tiempo de ejecución para Archivo no encontrado si el archivo es un recurso que debería estar allí. Sin embargo, es una excepción comprobada en el caso de que un usuario solicite un nombre de archivo específico que puede existir o no. Esto es especialmente cierto cuando se crean bibliotecas para las cuales el contexto no se conoce de antemano.¿Con esto quiere decir excepciones definidas por su implementación de terceros? ¿Correcto?
Si este tipo de excepción representa un error en su programa que no es causado por una entrada incorrecta del usuario, sino por algún problema con su código, entonces en Java debería ser una excepción en tiempo de ejecución.
Esta es una excepción comprobada en Java.
Si.
Si eso es correcto.
fuente