solo - try catch y throws java
Diferencia entre usar Throwable y Exception en un try catch (4)
Al capturar Throwable
incluye cosas que subclase Error
. Por lo general, no debe hacer eso, excepto tal vez en el nivel más alto de "captura todo" de un hilo en el que desea iniciar sesión o manejar de otra manera absolutamente todo lo que pueda 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 vaya mal con ese código, tanto como sea posible.
A veces veo
try {
} catch(Throwable e) {
}
Y aveces
try {
} catch(Exception e) {
}
Cuál es la diferencia
La primera captura todas las subclases de Throwable
(esto incluye Exception
y Error
), la segunda captura todas las subclases de Exception
.
Error
es programable de cualquier manera y por lo general no se puede detectar, excepto para fines de registro (que lo pasa de nuevo). Exception
es recuperable programáticamente. Su subclase RuntimeException
indica un error de programación y, por lo general, tampoco debe detectarse.
Thowable
captura realmente todo, incluso ThreadDeath, que se lanza de forma predeterminada para detener un hilo del método Thread.stop()
ahora en desuso. Por lo tanto, al capturar Throwable
puede estar seguro de que nunca abandonará el bloque try sin pasar al menos por su bloque catch, pero debe estar preparado para manejar también OutOfMemoryError
y InternalError
o Error
.
Catching Throwable
es más útil para los bucles de servidores externos que delegan todo tipo de solicitudes a código externo, pero que nunca pueden terminar para mantener el servicio activo.
Throwable
es una súper clase de Exception
y Error
. En casos normales, siempre deberíamos capturar subclases de Exception
, para que la causa raíz no se pierda.
Solo los casos especiales en los que ve la posibilidad de que las cosas salgan mal y no controle su código Java, debe detectar Error
o Throwable
.
Recuerdo haber capturado Throwable para marcar que una biblioteca nativa no está cargada.