Diferença entre usar o Throwable e a exceção em uma pegada de tentativa
-
20-09-2019 - |
Pergunta
Às vezes eu vejo
try {
} catch(Throwable e) {
}
E às vezes
try {
} catch(Exception e) {
}
Qual é a diferença
Solução
Pegando Throwable
Inclui coisas que subclasse Error
. Geralmente, você não deve fazer isso, exceto talvez no nível mais alto "Catch All" de um tópico em que deseja registrar ou lidar com absolutamente tudo o que pode dar errado. Seria mais típico em um aplicativo do tipo estrutura (por exemplo, um servidor de aplicativos ou uma estrutura de teste) onde pode estar executando código desconhecido e não deve ser afetado por nada Isso dá errado com esse código, tanto quanto possível.
Outras dicas
O primeiro captura todas as subclasses de Throwable
(isso inclui Exception
e Error
), o segundo captura todas as subclasses de Exception
.
Error
é programaticamente irrecuperável de alguma forma e geralmente não deve ser capturado, exceto para fins de registro (que passa novamente). Exception
é programaticamente recuperável. Sua subclasse RuntimeException
Indica um erro de programação e geralmente não deve ser capturado também.
Throwable
é super classe de Exception
assim como Error
. Em casos normais, devemos sempre capturar subclasses de Exception
, para que a causa raiz não se perca.
Apenas casos especiais em que você vê a possibilidade de as coisas dão errado que não estão no controle do seu código Java, você deve pegar Error
ou Throwable
.
Lembro -me de pegar o Throwable para sinalizar que uma biblioteca nativa não está carregada.
Thowable
pega realmente tudo, mesmo threaddeath, que é jogado por padrão para interromper um tópico do agora depreciado Thread.stop()
método. Então, pegando Throwable
Você pode ter certeza de que nunca deixará o bloco de tentativa sem pelo menos passar pelo seu bloco de captura, mas deve estar preparado para lidar com OutOfMemoryError
e InternalError
ou StackOverflowError
.
Pegando Throwable
é mais útil para loops de servidor externo que delegam todos os tipos de solicitações ao código externo, mas podem nunca terminam para manter o serviço vivo.