A veces veo
try {
} catch(Throwable e) {
}
Y aveces
try {
} catch(Exception e) {
}
¿Cuál es la diferencia?
A veces veo
try {
} catch(Throwable e) {
}
Y aveces
try {
} catch(Exception e) {
}
¿Cuál es la diferencia?
Respuestas:
Al atraparlo Throwable
incluye 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.
throw new Throwable();
, por lo que es la única forma de entenderlo todo.
El primero captura todas las subclases de Throwable
(esto incluye Exception
y Error
), el segundo captura todas las subclases de Exception
.
Error
es programáticamente irrecuperable de cualquier manera y generalmente no se debe capturar, excepto para fines de registro (que lo vuelve a pasar). Exception
es recuperable programáticamente Su subclase RuntimeException
indica un error de programación y, por lo general, tampoco debe detectarse.
Error
y 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"
programmatically unrecoverable
significa 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?
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.
Thowable
atrapa 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 Throwable
puede 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 OutOfMemoryError
y InternalError
o StackOverflowError
.
La captura Throwable
es 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.
Throwable
es super clase de Exception
asi 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 Error
o Throwable
.
Recuerdo haber capturado Throwable para indicar que una biblioteca nativa no está cargada.