Différence entre l'utilisation de Throwable et Exception dans un try catch

Réponses:

247

En attrapant, Throwableil inclut des choses qui appartiennent à la sous-classe Error. Vous ne devriez généralement pas faire cela, sauf peut-être au niveau le plus élevé de «capture de tout» d'un thread où vous voulez vous connecter ou sinon gérer absolument tout ce qui peut mal tourner. Ce serait plus typique dans une application de type framework (par exemple un serveur d'applications ou un framework de test) où elle peut exécuter du code inconnu et ne devrait pas être affectée par tout ce qui ne va pas avec ce code, autant que possible.

Yishai
la source
30
Il serait probablement préférable d'expliquer ici un peu de la hiérarchie.
Xonatron
11
Contexte de cette réponse: Throwable inclut à la fois Error et Exception en tant que sous-classes, donc le premier essai / capture comprend le second mais généralement trop large.
Noel
2
Il comprend également des sous-classes directes définies par l'utilisateur de Throwable et des instances de Throwable lui-même. Rien ne vous empêche d'écrire throw new Throwable();, c'est donc le seul moyen de tout saisir vraiment.
Antimony
3
Bien que cela soit accepté, cela ne répond pas à la question car la plupart des réponses décrivent une meilleure pratique pour intercepter à la fois les exceptions et les lancables, et la question portait sur la différence (comme quand utiliser quoi quand je veux). "Il inclut des éléments qui font partie de la sous-classe Erreur" est la seule différence spécifiée et c'est vraiment une réponse complète: Qu'est-ce que l'erreur? Pourquoi est-il important de l'inclure? D'autres différences ou meilleures pratiques?
Oded Niv
@OdedNiv "Qu'est-ce qu'une erreur? Pourquoi est-il important qu'elle l'inclue?" vous pouvez les poser dans une autre question.
Kronen
182

La première capture toutes les sous-classes de Throwable(cela inclut Exceptionet Error), la seconde capture toutes les sous-classes de Exception.

Errorest par programmation irrécupérable de quelque manière que ce soit et ne doit généralement pas être intercepté, sauf à des fins de journalisation (qui le repasse). Exceptionest récupérable par programme. Sa sous RuntimeException- classe indique une erreur de programmation et ne doit généralement pas être détectée également.

BalusC
la source
37
Étonnamment, 4 ans après cette réponse, la plupart des outils d '"analyse de code" signalent toujours la capture de throwable comme une erreur critique . La journalisation est une raison très valable pour attraper Throwable. Des années de développement de serveurs me disent que 1) la journalisation se produira malgré l'obtention d'un Erroret 2) à moins qu'il y ait une journalisation, vous ne serez peut-être jamais averti qu'un MOO s'est produit, vous laissant vous demander pourquoi le serveur a commencé à se comporter "drôle"
Bruno Grieder
4
Que programmatically unrecoverablesignifie exactement? Est-il si grave que nous ne pouvons plus appeler AUCUNE méthode Java après l'avoir interceptée (journalisation, etc.) sans avoir la possibilité d'obtenir un comportement imprévisible de la JVM en conséquence?
Alexander Abakumov
Its subclass RuntimeException indicates a programming error: Je ne sais pas si je suis d'accord avec cette déclaration. Si cela est vrai, cela signifie que toutes les exceptions attendues doivent être vérifiées. Que faire si je m'attends à ce que quelque chose échoue et ne soit pas récupérable par mon application, mais je souhaite au moins lever une exception significative? L'utilisation d'une exception vérifiée dans ce cas semble inutile et crée un code passe-partout.
Nom1fan
22

Thowableattrape vraiment tout, même ThreadDeath qui est levé par défaut pour arrêter un thread de la Thread.stop()méthode désormais obsolète . Ainsi, en attrapant, Throwablevous pouvez être sûr que vous ne quitterez jamais le bloc try sans au moins passer par votre bloc catch, mais vous devez être prêt à gérer également OutOfMemoryErroret InternalErrorou StackOverflowError.

La capture Throwableest la plus utile pour les boucles de serveur externes qui délèguent toutes sortes de demandes à du code extérieur, mais elles ne peuvent jamais s'arrêter pour maintenir le service en vie.

x4u
la source
21

Throwableest super classe de Exceptionainsi que Error. Dans des cas normaux, nous devrions toujours attraper des sous-classes de Exception, afin que la cause racine ne soit pas perdue.

Seuls les cas spéciaux où vous voyez la possibilité que les choses tournent mal qui ne contrôlent pas votre code Java, vous devez intercepter Errorou Throwable.

Je me souviens avoir attrapé Throwable pour signaler qu'une bibliothèque native n'est pas chargée.

rai.skumar
la source
0

J'ai vu des gens utiliser Throwable pour détecter certaines erreurs qui pourraient se produire en raison d'une panne / non disponibilité infra.

Lance A1
la source