2012-02-29 21 views
7

Me gustaría capturar una excepción, registrarla, establecer un indicador, y el volver a lanzar la misma excepciónjava: no se puede volver a lanzar una excepción: no controlada tipo de excepción Excepción

tengo este código:

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
     feed.fetchContents(); 
    } catch (Exception ex) { 
     result = false; 
     Logger.info("fetching feed(%d) failed", feedId); 
     throw ex; 
    } 
    return result; 
} 

Pero eclipse se queja en throw ex, diciendo que "Excepción no controlada tipo Exception", y me sugiere agregar un bloque try-catch alrededor de él.

De hecho, quiero que el proceso de llamar a este método para manejar la excepción, y no manejar yo mismo ... sólo quiero devolver verdadero si todo va bien, y registrar si hay una excepción

En Por otro lado, puedo envolver la excepción dentro de otra excepción, pero no puedo lanzar la misma ...

¿Alguna idea?

Respuesta

2

creo que hay varias cosas que mencionar aquí:

  1. usted desee, ya sea para volver doJobWithResult() cierto en falso en caso de fracaso, o nada volver sobre el éxito y lanzar una excepción en caso de fallo. Ambos al mismo tiempo no es posible. En el primer caso, capture la excepción, regístrela y devuelva false; en el segundo caso, cambie su firma para devolver void y ejecute una excepción y tráigala en la persona que llama.
  2. Es No hacer para detectar una excepción, registrarla y volver a lanzarla. ¿Por qué? Debido a que un potencial llamante de su método no sabe que ya lo está registrando, también puede registrarlo. O lanzar una excepción (en cuyo caso la persona que llama tiene que tratar con ella) o atraparla y manejarla (registrarla).
  3. Tenga en cuenta que arrojar Exception no da ninguna pista sobre qué podría salir mal en su método, siempre es mejor lanzar excepciones más específicas, o ajustar una excepción en un definido por el usuario y volver a lanzarlo .
  4. Además, si arroja Exception, una persona que llama puede tener la tentación de atrapar Exception sin darse cuenta de que esto también capturará cada RuntimeException (ya que deriva de Exception), lo que podría no ser el comportamiento deseado.
+0

todas las respuestas fueron muy útiles, creo que esta también da algunos consejos sobre cómo lidiar con excepciones ... – opensas

2

Desde Exception es checked, una alternativa para controlar el Exception es declarar su método como tirarlo:

public Boolean doJobWithResult() throws Exception { 
    // ... 
} 
7

Su método doJobWithResult tiene que declarar que puede lanzar excepciones:

public Boolean doJobWithResult() { 

se convierte en

public Boolean doJobWithResult() throws Exception { 
3

Si doJobWithResult no tiene que manejar la excepción, elimine el bloque catch y agregue "throws Exception" a la firma del método. El registro de excepciones se puede hacer en la clase/método que tiene que tratar con la excepción en un bloque try/catch correspondiente.

2

No es necesario establecer el resultado como falso en el bloque catch, ya que no se devolverá el valor (ya que estamos lanzando una excepción).

Su método también debe declarar que arroja una excepción por lo que el cliente se verá obligado a manejarlo.

Considere también el uso de una excepción más específica que se arrojará en este caso particular.

4

Puede lanzar la misma excepción si agrega throws Exception a la firma de su método. De lo contrario, puede lanzar un RuntimeException.

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
     feed.fetchContents(); 
    } catch (Exception ex) { 
     result = false; 
     Logger.info("fetching feed(%d) failed", feedId); 
     throw new RuntimeException(ex); 
    } 
    return result; 
} 

En tal caso, no será necesario indicar que public Boolean doJobWithResult() tiros algo, pero asegúrese de que usted lo maneja adecuadamente más adelante (captura o esperar que su hilo para parar ... es una RuntimeException después).

0

que podría lanzar una excepción sin control

Logger.info("fetching feed(%d) failed", feedId); 
throw new RuntimeException(ex); 
1

Añadir throws Exception a su método. Tampoco necesita agregar result = false; en su bloque catch.

1

Creo que la forma de manejar esta excepción es realmente adecuada si no se puede recuperar el error del método feed.fetchContents().(Idea es mejor detenerse en lugar de continuar) Aparte de eso, le sugiero que utilice una jerarquía de excepciones más específica.

Y otra cosa que obtuve del libro efectivo de Java es que si escribe este método, debe documentar con @throw (en comentarios) el motivo.

Cuestiones relacionadas