As vezes eu vejo
try {
} catch(Throwable e) {
}
E às vezes
try {
} catch(Exception e) {
}
Qual é a diferença?
As vezes eu vejo
try {
} catch(Throwable e) {
}
E às vezes
try {
} catch(Exception e) {
}
Qual é a diferença?
Respostas:
Ao capturá- Throwable
lo, inclui coisas que subclasses Error
. Geralmente, você não deve fazer isso, exceto, talvez, no nível mais alto de "pegar todos" de um encadeamento em que deseja registrar ou manipular absolutamente tudo o que pode dar errado. Seria mais típico em um aplicativo do tipo de estrutura (por exemplo, um servidor de aplicativos ou uma estrutura de teste) em que ele pode estar executando código desconhecido e não deve ser afetado por qualquer coisa que dê errado com esse código, tanto quanto possível.
throw new Throwable();
, por isso é a única maneira de capturar tudo de verdade.
O primeiro captura todas as subclasses de Throwable
(isso inclui Exception
e Error
), o segundo captura todas as subclasses de Exception
.
Error
é irrecuperável programaticamente de qualquer forma e geralmente não deve ser capturado, exceto para fins de registro (que passa novamente). Exception
é recuperável programaticamente. Sua subclasse RuntimeException
indica um erro de programação e geralmente não deve ser capturado também.
Error
e 2) A menos que exista um log, você nunca poderá ser notificado de que ocorreu uma OOM, deixando você se perguntando por que o servidor começou a se comportar como "engraçado"
programmatically unrecoverable
significa exatamente? É tão grave que não podemos basicamente chamar QUALQUER método Java depois de capturá-lo mais (log etc.) sem a chance de obter um comportamento imprevisível da JVM como resultado?
Its subclass RuntimeException indicates a programming error
: Não tenho certeza se concordo com esta afirmação. Se isso for verdade, significa que todas as exceções esperadas devem ser verificadas. E se eu espero que algo possa falhar e seja irrecuperável pelo meu aplicativo, mas desejo pelo menos lançar uma exceção significativa? Usar uma exceção verificada nesse caso parece inútil e cria um código padrão.
Thowable
captura realmente tudo, mesmo o ThreadDeath que é lançado por padrão para interromper um thread do Thread.stop()
método agora obsoleto . Portanto, ao capturar, Throwable
você pode ter certeza de que nunca sairá do bloco try sem pelo menos passar pelo bloco catch, mas você deve estar preparado para também manipular OutOfMemoryError
e InternalError
ou StackOverflowError
.
A captura Throwable
é mais útil para loops de servidor externo que delegam todos os tipos de solicitações para código externo, mas podem nunca ser finalizados para manter o serviço ativo.
Throwable
é super classe de Exception
, bem como Error
. Em casos normais, devemos sempre pegar subclasses deException
, para que a causa raiz não se perca.
Apenas casos especiais em que você vê a possibilidade de algo dar errado e que não está no controle do seu código Java, você deve capturar Error
ou Throwable
.
Lembro-me de pegar Throwable para sinalizar que uma biblioteca nativa não está carregada.