Gestion de Errores (Exception) en java

Desde que empece a programar en java se me ha enseñado a controlar errores con el bloque de try catch ... ahora que he tenido la oportunidad de participar en un sistema robusto me he encontrado con la necesidad de identificar varias excepciones solo que que por decuido mio y algunos solo utilize el tipo de Exception general (Exception e)... y ahora que debo de corregir este error de identificar por el tipo de una exception especifica ("No se ha podido ejecutar el quary") (" etc etc ") una opcion seria la siguiente :

try {
-- Codigo de funcionalidad X

}catch (UncategorizedSQLException e) {
-- Muestro mensaje correspondiente a la exception
} catch (SQLException e) {
-- Muestro mensaje correspondiente a la exception
} catch (NotFoundException e) {
-- Muestro mensaje correspondiente a la exception
} catch (IOException e) {
-- Muestro mensaje correspondiente a la exception
} catch (Exception e) {
-- Muestro mensaje correspondiente a la exception
}

Esto lo he obtenido de otro proyecto que aqui se esta desarrollando pero me he preguntado es la mejor manera ? ya que se me ha ocurrido hacer una excepcion personalizada que englobe todas las mencionadas y identifique que mensaje mostrar ...

Bueno eso pienso que podria hacer pero me gustaria saber como ustedes manejan las exception ya que siento que podria excistir una mejor y mas elegante manera ya que es mucho codigo que tendriamos que cambiar por cada try pero espero sus comentarios... ya que mi experiencia no es tan amplia en estos casos. Que exception son las mas comunes que se deben de controlar en un proyecto etc ..

Saludos gracias por sus comentarios

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

grupos

Pues maneja grupos, tan generales o específicos como necesites. Por ejemplo UncategorizedSQLException seguramente es una subclase de SQLException. Si necesitas manejarla aparte está bien, pero si necesitas manejarla igual que cualquier otra bronca de SQL entonces puedes eliminar ese catch y se manejará igual que SQLException.

La NotFoundException probablemente sea algo de algún framework o biblioteca que estén manejando, pues Java no incluye una excepción con ese nombre.

Y en general no se recomienda cachar Exception. Solamente debes cachar las excepciones que vas a manejar; las que no manejes, déjalas pasar a quien haya invocado tu método (si son declaradas pues deberás ponerlas en la declaración de tu método, si son runtime pues no es necesario).

Y así como se considera mala práctica cachar Exception, también se considera mala práctica declarar un método con throws Exception.

Imagen de neko069

Aparte de lo que te mencionó

Aparte de lo que te mencionó @ezamudio, te tocan unos tablazos en las manos, por manejar Exception, si vas a hacer excepciones personalizadas, también trata de que sean del mismo tipo, es decir, no vayas a meter un FileNotFoundException y un SQLException en la misma excepción personalizada, pero para ésto, ya debiste analizar previamente qué excepciones puedes englobar en una personalizada, cierto?

A parte de lo que te comentan

Bueno no sé si voy a comentar una burrada pero al menos a mi me sirve, si tu programa o sistema tiene implementado MVC los try{}catch (Exception e) } deberias dejarlos de lado del Controlador y los throws Exception de lado del modelo por ejemplo

public class Controlador{
.
private String mensaje;
.

try {
                clientes = TablaBusquedaCuentaDAO.obtenClientes();
                } catch (NamingException e) {
                        mensaje = e.getMessage();
                       log.error(e);
                } catch (SQLException e) {
                        mensaje = e.getMessage();

                }
}

y luego

public class TablaBusquedaCuentaDA{//modelo
.
.
.
public static SelectItem[] obtenClientes() throws NamingException, SQLException{

}

}

De esta forma si algo falla tienes la posibilidad de que regresas el control del programa al Controlador y pintar un mensaje en la Vista y no el feo stackTrace

Si lo que digo no es correcto por favor haganmelo saber porque entonces he vivido engañado :-P

Imagen de ezamudio

está bien

Hugo, lo que mencionas está bien. Cuando decimos que está mal manejar Exception nos referimos a literalmente cachar Exception, o declarar throws Exception, porque es demasiado general, abarca tanto excepciones declaradas como de tiempo de ejecución, además de que dentro de las declaradas, estás cachando excepciones que no deberían porque ocultan problemas de programación (como por ejemplo NullPointerException o IndexOutOfBoundsException, que no se deben arrojar en un sistema en producción; son síntoma de que hay defectos en el código).

Imagen de bferro

¿Acceso a un DAO en un controlador?

¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ ???????????????????????????????'
¿Dónde quedó el modelo?

Imagen de rj@vasso

Conclucion !! gracias a todos

Entonces por lo entendido necesitamos evitar esta mal practica de utilizar (Exception e) ya que contiene o agrupa todas los errores posibles excepciones declaradas como de tiempo de ejecución por lo que zamudio nos ha explicado

Bueno parece que necesito estudiar los diferentes tipos de Exception que contiene java como para definir las que necesito declarar... bueno para estar seguro de todo esto necito implementarlo y les cuento...

En cuanto termine posteo mi solucion o mi estructura de exception ... Gracias por sus respuestas y si tienen mas sugerencias son bien recibidas ..

Saludos a todos ..

Tambien cachar excepciones para solo pintarlas

Realmente no podria servirte de nada cathcar 5 Excepciones si a todas les aplicas un simple ex.printStackTrace();. Un ejemplo es

try {
    // haz algo que pueda generar varias excepciones
} ctatch (AaaException ae) {
    ae.printStacktrace();
    solucionAException();
}
} ctatch (BbbException be) {
    be.printStacktrace();
}
} ctatch (CccException ce) {
    ce.printStacktrace();
}
} ctatch (DddException de) {
    de.printStacktrace();
}

Lo que dice @ezamudio es muy cierto

Solamente debes cachar las excepciones que vas a manejar

y el hecho de imprimir el stacktrace no significa que estes tratando la excepcion, en todo caso seria util escribir unicamente

try {
    // haz algo que pueda generar varias excepciones
} ctatch (AaaException ae) {
    ae.printStacktrace();
    solucionAException();
}

y al metodo agregarle throws BbbException, CccException, DddException y ya quien implementa el codigo si piensa que imprimir stacktrace resuelve el conflicto pos ya es cosa de su codigo. Algo importante es pensar que las excepciones son para que las maneje el codigo no el humano (en todo caso eso ya seria cuando de plano no hubo nada que resolver)