Ao capturá- Throwablelo, 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.
Provavelmente seria melhor explicar um pouco da hierarquia aqui.
Xonatron 06/02
11
Contexto para esta resposta: Throwable inclui Error e Exception como subclasses, portanto, a primeira tentativa / captura inclui a segunda, mas geralmente é abrangente.
1128 Noel Noel
2
Ele também inclui subclasses diretas definidas pelo usuário de Throwable e instâncias do próprio Throwable. Não há nada que o impeça de escrever throw new Throwable();, por isso é a única maneira de capturar tudo de verdade.
Antimony
3
Embora aceito, isso não está respondendo à pergunta porque a maior parte da resposta descreve uma prática recomendada para capturar Exceção e Jogável, e a pergunta era sobre a diferença (como em quando usar qual quando eu quero). "Inclui itens da subclasse Erro" é a única diferença especificada e é realmente uma resposta abrangente: O que é erro? Por que importa que inclui? Alguma outra diferença ou prática recomendada?
Oded Niv
@OdedNiv "O que é um erro? Por que importa que ele inclui?" você pode fazer as perguntas em outra pergunta.
Kronen
182
O primeiro captura todas as subclasses de Throwable(isso inclui Exceptione 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 RuntimeExceptionindica um erro de programação e geralmente não deve ser capturado também.
Surpreendentemente, 4 anos após essa resposta, a maioria das ferramentas de "análise de código" ainda relatará a captura lançável como um erro crítico . O registro é uma razão muito válida para capturar Throwable. Anos de desenvolvimento de servidores me dizem que 1) O log ocorrerá apesar de receber um Errore 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"
Bruno Grieder,
4
O que 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?
Alexander Abakumov
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.
Nom1fan 18/04/19
22
Thowablecaptura 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, Throwablevocê 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 OutOfMemoryErrore InternalErrorou 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 Errorou Throwable.
Lembro-me de pegar Throwable para sinalizar que uma biblioteca nativa não está carregada.
Respostas:
Ao capturá-
Throwable
lo, inclui coisas que subclassesError
. 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.fonte
throw new Throwable();
, por isso é a única maneira de capturar tudo de verdade.O primeiro captura todas as subclasses de
Throwable
(isso incluiException
eError
), o segundo captura todas as subclasses deException
.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 subclasseRuntimeException
indica um erro de programação e geralmente não deve ser capturado também.fonte
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 doThread.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 manipularOutOfMemoryError
eInternalError
ouStackOverflowError
.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.fonte
Throwable
é super classe deException
, bem comoError
. 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
ouThrowable
.fonte
Vi pessoas usarem o Throwable para capturar alguns erros que podem ocorrer devido a falhas / indisponibilidade de infra-estrutura.
fonte