2012-08-07 21 views
6

Hey Comunidad StackOverflow,Excepciones de lanzamiento y captura

En cuanto a arrojar excepciones. En general, ¿cuándo tiro y la excepción, y cuándo la atrapo?

Digamos que me encuentro con esta situación en la que tengo que abandonar debido a algún problema que ocurrió y no me puedo recuperar. ¿Lanzo o atrapo?

hago esto ahora:

try { 
     // some code 
    } 
    catch (IOException e) { 
     logger.info("Failed to do something, and cannot continue" + e.getMessage(), e); 
     e.printStackTrace(); 
     throw e; 
    } 

Es esto lo que hay que hacer? ¿Sería más apropiado si lanzo la excepción? Lo siento, soy un novato en excepciones :)

Respuesta

8

Generalmente se detecta una excepción en un método cuando se desea que el programa continúe ejecutándose. Lanza una excepción cuando desea un método de nivel superior que llame a ese método para manejar la excepción. Por ejemplo, puede arrojarlo todo el camino de vuelta a su método principal, que tiene un bloque try..catch (probablemente con diferentes bloques catch para diferentes excepciones) que encapsula todas sus llamadas a métodos, y las excepciones se pueden manejar allí (por ejemplo, mediante terminando el programa).

Recuerde que lanzar una excepción terminará el método inmediatamente. Esto afecta el flujo de tu código. Si puede tener una excepción en el medio del método y el código que se muestra debajo no se puede ejecutar si se produjo esa excepción, entonces deberá envolver toda la sección en un bloque try/catch o lanzar una excepción.

Un consejo general - printStackTrace() es malo. Puede crear mejor salida de error usted mismo (y puede incluir también el seguimiento de la pila con su salida). Mejor aún, usa el registro.

Recomiendo leer this introduction to exceptions y this article which covers good and bad exception patterns.

1

Si se produce una excepción fatal, capture la excepción y finalice su programa correctamente. Retirarse sin atrapar matará tu programa.

0

Después de atrapar yo registraría el incidente y luego haré lo que necesita para cerrarlo ordenadamente y luego llamar a System.exit pero no lanzaría esa excepción nuevamente.

0

Es una mala práctica que su programa termine debido a una excepción no controlada. Si se coge una excepción que es fatal e irrecuperable hacer lo siguiente:

  1. registrarla
  2. realizar cualquier limpieza necissary
  3. terminar el programa
1

Si conoce la excepción no es algo que se puede manejar, deje la excepción sin atraparla en primer lugar. Tenga un manejador de excepciones que capture todo y lo registre en un archivo junto con stacktrace. Por ejemplo, si su programa se ejecuta desde la línea de comando, puede capturar todo en el método principal y registrarlo allí.

+0

Así que estás diciendo que si tengo una excepción que no puedo manejar dentro de ese método, debería lanzarla. Pero, si puedo recuperarme dentro del mismo método, entonces es cuando es apropiado atrapar dentro del método. Además, ¿debo dejar la excepción de captura de (métodos, pruebas) que implementan el método subyacente que la arrojó? –

+0

sí, solo captas con qué puedes hacer algo. No entendí la última parte. ¿Podrías reformular eso? –

+0

Lo siento, déjame intentarlo de nuevo. Lo que realmente quise decir es que cuando uso un método que arroja una excepción en alguna prueba unitaria o un método principal, y digamos que hago que la prueba arroje la excepción. ¿Qué pasa allí? ¿Se acaba de dejar? ¿Imprime mensajes de error? ¿Qué es lo más apropiado para hacer en esta situación? –

1


Usted captura excepción cuando tiene algo que ver con eso. En su caso: escriba en el registro, muestre un mensaje al usuario y salga de manera ordenada.
Usted arroje una excepción cuando no hay nada más que pueda hacer al respecto cuando sucede.

Le recomiendo que utilice el bloque de aplicación de manejo de excepciones de la biblioteca empresarial de Microsoft. Le ayudará a manejar sus excepciones, de esta forma podrá controlar el flujo y realizar cambios de forma configuracional.

Cuestiones relacionadas