2011-12-08 18 views
11

Para mi aplicación Java, estoy creando una instancia de un objeto de información de usuario y llenándolo con un servicio que no controlo la fuente.Java - ignorar excepción y continuar

El código es el siguiente:

// username given as parameter 
UserInfo ui = new UserInfo(); 
try { 
    DirectoryUser du = LDAPService.findUser(username); 
    if (du!=null) { 
     ui.setUserInfo(du.getUserInfo()); 
    } 
} catch (Exception e) { 
    // Whatever 
} 

Si LDAPService.findUser() no puede localizar a un usuario, arrojará un NullPointerException y triturar el resto de mi solicitud a una parada. Está bien si la información del usuario no está completa, por lo que quiero poder continuar sin hacer que todo lo demás empiece a lanzar excepciones.

¿Hay alguna manera de hacerlo?

+6

¡Ignorar excepciones es una mala práctica! – mre

+5

¿Su código no hace esto? Siempre que '// Whatever' no haga nada, la ejecución continuará normalmente después del bloque try/catch. –

+0

¿cuál es el problema? Si 'findUser' arroja una excepción, queda atrapada en el' catch' que ya ha escrito. No se detendrá anythign? – Nanne

Respuesta

18

He votado Amir Afghani's answer, que parece ser el único hasta el momento que realmente responde la pregunta.

Pero yo lo hubiera escrito esta forma:

UserInfo ui = new UserInfo(); 

DirectoryUser du = null; 
try { 
    du = LDAPService.findUser(username); 
} catch (NullPointerException npe) { 
    // It's fine if findUser throws a NPE 
} 
if (du != null) { 
    ui.setUserInfo(du.getUserInfo()); 
} 

Por supuesto, depende de si o no se desea capturar NPE de los ui.setUserInfo() y du.getUserInfo() llamadas.

+1

Voy a marcar el suyo como respuesta. Parece que todo lo que necesitaba era un bloque de try/catch más estricto. – SpeedBurner

+1

He votado su respuesta porque a) tiene razón, yb) me ha llamado explícitamente. –

+0

Agregaría que, dado que no necesariamente queremos captar e ignorar TODAS las NullPointerExceptions, podríamos ver los detalles del NPE (getCause, getMessage, getLocalizedMessage, getStackTrace) y si no coincide con un criterio muy específico y restringido , vuelve a tirarlo. Pero luego, me di cuenta de que mi comentario fue aproximadamente 7 años después del hecho. – mtwagner

0

Puede escribir un bloque try - catch alrededor de la línea que desea ignorar.

Al igual que en el código de ejemplo de los suyos. Si continúa con su código debajo del corchete de cierre del bloque de capturas todo está bien.

3

Ya lo está haciendo en su código. Ejecute este ejemplo a continuación. La captura "manejará" la excepción, y usted puede seguir adelante, suponiendo que lo que haya capturado y manejado no haya descifrado el código que no anticipó.

try{ 
     throw new Exception(); 
}catch (Exception ex){ 
    ex.printStackTrace(); 
} 
System.out.println("Made it!"); 

Sin embargo, siempre debe manejar una excepción correctamente. Puede meterse en algunas situaciones bastante complicadas y escribir código difícil de mantener al "ignorar" las excepciones. Solo debe hacer esto si realmente está manejando lo que salió mal, con la excepción del punto en que realmente no afecta el resto del programa.

0

El servicio LDAP debe contener un método como LDAPService.isExists(String userName) para evitar el lanzamiento de NPE. Si no es así, esto podría ser una solución, pero use el registro para publicar una advertencia.

+0

El principal problema es que no puedo editar la clase LDAPService. – SpeedBurner

+0

Si hay una forma de saber que el usuario no está presente en LDAP es obtener NPE, está bien ignorarlo, pero por cierto, debe iniciar sesión en la capa INFO/DEBUG –

2

En general, se considera una mala idea ignorar las excepciones. Por lo general, si es apropiado, desea notificar al usuario el problema (si les importaría) o, como mínimo, registrar la excepción o imprimir el seguimiento de la pila en la consola.

Sin embargo, si eso realmente no es necesario (usted es el que toma la decisión), entonces no, no hay otra manera de ignorar una excepción que lo obligue a atraparlo. La única revisión, en ese caso, que sugeriría es incluir explícitamente la clase de las Excepciones que está ignorando, y algún comentario sobre por qué las está ignorando, en lugar de simplemente ignorar cualquier excepción, ya que lo has hecho en tu ejemplo.

18

Puede tomar el NullPointerException explícitamente e ignorarlo, aunque generalmente no es recomendable. Debe no, sin embargo, ignore todas las excepciones como lo hace actualmente.

UserInfo ui = new UserInfo(); 
try { 
    DirectoryUser du = LDAPService.findUser(username); 
    if (du!=null) { 
     ui.setUserInfo(du.getUserInfo()); 
    } 
} catch (NullPointerException npe) { 
    // Lulz @ your NPE 
    Logger.log("No user info for " +username+ ", will find some way to cope"); 
} 
1

Usted está ignorando la excepción en su código. Pero te sugiero que reconsideres.

Aquí es una cita de Coding Crimes: Ignoring Exceptions

Para empezar, la excepción debe ser registrado por lo menos, no acaba de escribir en la consola.Además, en la mayoría de los casos, la excepción debe devolverse a la persona que llama para que ellos puedan manejarla. Si no necesita ser devuelto a la persona que llama, se debe manejar la excepción . Y algunos comentarios también serían agradables.

La excusa habitual para este tipo de código es "yo no tengo tiempo", pero hay un efecto dominó cuando el código se deja en este estado. Las posibilidades son que la mayoría de este tipo de código nunca saldrá en la producción final . Las revisiones de código o las herramientas de análisis estático deberían detectar este patrón de error . Pero eso no es excusa, todo lo que hace es agregar tiempo al mantenimiento y la depuración del software.

Incluso si lo está ignorando, le sugiero que utilice nombres de excepción específicos en lugar del nombre de la superclase. es decir, use NullPointerException en lugar de Exception en su cláusula catch.

0

Imprimir la traza de la pila, iniciar sesión o enviar un mensaje al usuario, son muy malas formas de procesar las excepciones. ¿Alguien puede describir las soluciones para arreglar la excepción en los pasos correctos, entonces puede intentar la instrucción rota nuevamente?