2010-02-16 11 views
182

A veces veodiferencia entre el uso de Throwable y Excepción en un intento de captura

try { 

} catch(Throwable e) { 

} 

Y a veces

try { 

} catch(Exception e) { 

} 

¿Cuál es la diferencia

+6

duplicado: http://stackoverflow.com/questions/581878/why-catch-exceptions-in-java-when-you-can-catch-throwables –

+2

relacionadas: http://stackoverflow.com/questions/2129647/exception-vs-throwable-in-java http://stackoverflow.com/questions/498217/when-should-throwable-be-used-instead-of-new-exception –

Respuesta

158

Al detectar Throwable que incluye cosas que subclase Error. Por lo general, no debes hacer eso, excepto tal vez en el nivel más alto de "atrapar todo" de un hilo en el que quieras iniciar sesión o manejar absolutamente todo lo que pueda salir mal. Sería más típico en una aplicación de tipo de marco (por ejemplo, un servidor de aplicaciones o un marco de prueba) donde se puede ejecutar código desconocido y no debería verse afectado por cualquier cosa que funcione mal con ese código, tanto como sea posible.

+20

Probablemente sería mejor explicar un poco de la jerarquía aquí. – Xonatron

+5

Contexto para esta respuesta: Throwable incluye tanto Error como Exception como subclases, por lo que el primer try/catch incluye el segundo pero generalmente es demasiado amplio. – Noel

+2

También incluye subclases directas de Throwable definidas por el usuario e instancias de Throwable. No hay nada que te impida escribir 'throw new Throwable();', por lo que es la única forma de capturar todo. – Antimony

116

El primero capta todas las subclases de Throwable (esto incluye Exception y Error), el segundo uno coge todas las subclases de Exception.

Error es programáticamente irrecuperable de ninguna manera y, por lo general, no se puede atrapar, excepto para fines de registro (que lo reenvía). Exception es programáticamente recuperable. Su subclase RuntimeException indica un error de programación y generalmente no se detecta.

+17

Sorprendentemente, 4 años después de esta respuesta, la mayoría de las herramientas de "análisis de código" seguirán informando que la captura arrojada es un error * crítico *. El registro es una razón muy válida para atrapar a Throwable. Años de desarrollo de servidores me dicen que 1) La registración ocurrirá a pesar de obtener un 'Error' y 2) A menos que haya un registro, puede que nunca se notifique que ocurrió un OOM, dejándote preguntándote por qué el servidor comenzó a comportarse de manera "graciosa" –

+0

¿Qué hace? 'programmatically irrecuperable' significa exactamente? ¿Es tan grave que básicamente no podemos llamar CUALQUIER método Java después de atraparlo más (registro, etc.) sin la posibilidad de obtener un comportamiento imprevisible de JVM como resultado? –

9

Thowable capta realmente todo, incluso ThreadDeath, que se arroja por defecto para detener un hilo del método ahora obsoleto Thread.stop(). Entonces, al capturar Throwable, puede estar seguro de que nunca abandonará el bloque try sin al menos pasar por su bloque catch, pero también debe estar preparado para manejar OutOfMemoryError y InternalError o StackOverflowError.

La captura de Throwable es más útil para los bucles externos del servidor que delegan todo tipo de solicitudes al código externo, pero nunca pueden terminar para mantener el servicio activo.

10

Throwable es super clase de Exception así como Error. En casos normales, siempre debemos tomar las subclases de Exception, para que la causa raíz no se pierda.

Solo casos especiales en los que vea la posibilidad de que algo vaya mal y no controle su código Java, debe capturar Error o Throwable.

Recuerdo haber capturado Throwable para indicar que no se ha cargado una biblioteca nativa.

Cuestiones relacionadas