Diferencia entre usar Throwable y Exception en un intento de captura

Respuestas:

247

Al atraparlo Throwableincluye cosas que subclase Error. En general, no debe hacer eso, excepto quizás en el nivel más alto de "capturar todo" de un hilo en el que desea iniciar sesión o de otra manera manejar absolutamente todo lo que puede salir mal. Sería más típico en una aplicación de tipo marco (por ejemplo, un servidor de aplicaciones o un marco de prueba) donde puede ejecutar código desconocido y no debería verse afectado por nada que salga mal con ese código, tanto como sea posible.

Yishai
fuente
30
Probablemente sería mejor explicar un poco de la jerarquía aquí.
Xonatron
11
Contexto para esta respuesta: Throwable incluye tanto Error como Exception como subclases, por lo que el primer intento / captura incluye el segundo pero generalmente es demasiado amplio.
Noel
2
También incluye subclases directas definidas por el usuario de Throwable e instancias de Throwable. No hay nada que te impida escribir throw new Throwable();, por lo que es la única forma de entenderlo todo.
Antimonio
3
Aunque se acepta, esto no responde a la pregunta porque la mayoría de la respuesta describe una mejor práctica para atrapar tanto Exception como Throwable, y la pregunta era sobre la diferencia (como cuándo usar cuál cuando QUIERO). "Incluye cosas que subclase Error" es la única diferencia especificada y es realmente una respuesta integral: ¿Qué es el error? ¿Por qué importa que lo incluya? ¿Alguna otra diferencia o mejores prácticas?
Oded Niv
@OdedNiv "¿Qué es un error? ¿Por qué importa que lo incluya?" puedes hacer eso en otra pregunta.
Kronen
182

El primero captura todas las subclases de Throwable(esto incluye Exceptiony Error), el segundo captura todas las subclases de Exception.

Errores programáticamente irrecuperable de cualquier manera y generalmente no se debe capturar, excepto para fines de registro (que lo vuelve a pasar). Exceptiones recuperable programáticamente Su subclase RuntimeExceptionindica un error de programación y, por lo general, tampoco debe detectarse.

BalusC
fuente
37
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 se puede lanzar como un error crítico . El registro es una razón muy válida para atrapar Throwable. Los años de desarrollo de servidores me dicen que 1) el registro se realizará a pesar de obtener un Errory 2) A menos que haya un registro, es posible que nunca se le notifique que ocurrió un OOM, lo que le hace preguntarse por qué el servidor comenzó a comportarse "divertido"
Bruno Grieder
44
¿Qué programmatically unrecoverablesignifica exactamente? ¿Es tan grave, que básicamente no podemos llamar a CUALQUIER método Java después de atraparlo más (registro, etc.) sin la posibilidad de obtener un comportamiento impredecible de JVM como resultado?
Alexander Abakumov
Its subclass RuntimeException indicates a programming error: No estoy seguro si estoy de acuerdo con esta declaración. Si eso es cierto, significa que todas las excepciones esperadas deben ser verificadas. ¿Qué sucede si espero que algo falle y mi aplicación no pueda recuperarlo, pero deseo al menos lanzar una excepción significativa? Usar una excepción marcada en ese caso parece inútil y crea un código repetitivo.
Nom1fan
22

Thowableatrapa realmente todo, incluso ThreadDeath, que se lanza de forma predeterminada para detener un hilo del Thread.stop()método ahora obsoleto . Así que por la captura Throwablepuede estar seguro de que nunca a dejar el bloque try sin al menos de pasar por su bloque catch, pero usted debe estar preparado para manejar también OutOfMemoryErrory InternalErroro StackOverflowError.

La captura Throwablees más útil para los bucles externos del servidor que delegan todo tipo de solicitudes al código externo, pero que nunca terminan para mantener vivo el servicio.

x4u
fuente
21

Throwablees super clase de Exceptionasi como Error. En casos normales, siempre debemos capturar subclases de Exception, para que la causa raíz no se pierda.

Sólo los casos especiales en los que se ven posibilidad de las cosas mal que no está en control de su código Java que van, se deben tomar Erroro Throwable.

Recuerdo haber capturado Throwable para indicar que una biblioteca nativa no está cargada.

rai.skumar
fuente
0

He visto a personas usar Throwable para detectar algunos errores que podrían ocurrir debido a una falla infra / falta de disponibilidad.

Lanza A1
fuente