Parfois je vois
try {
} catch(Throwable e) {
}
Et parfois
try {
} catch(Exception e) {
}
Quelle est la différence
En attrapant Throwable
, il inclut des éléments de la sous-classe Error
. Vous ne devriez généralement pas faire cela, sauf peut-être au plus haut niveau "attraper tout" d'un thread sur lequel vous voulez vous connecter ou autrement gérer absolument tout ce qui peut mal tourner. Ce serait plus typique dans une application de type framework (par exemple un serveur d’application ou un framework de test) où elle peut exécuter un code inconnu et ne devrait pas être affectée par quoi que ce soit qui va mal avec ce code, autant que possible.
Le premier capture toutes les sous-classes de Throwable
(ceci inclut Exception
et Error
), le second saisit toutes les sous-classes de Exception
.
Error
est programmable de quelque façon que ce soit et ne doit généralement pas être attrapé, sauf à des fins de journalisation (qui le retransmet). Exception
est récupérable par programme. Sa sous-classe RuntimeException
indique une erreur de programmation et ne doit généralement pas être également interceptée.
Throwable
est une super classe de Exception
ainsi que Error
. Dans des cas normaux, nous devrions toujours attraper les sous-classes de Exception
, afin que la cause fondamentale ne soit pas perdue.
Seuls les cas spéciaux où vous voyez une possibilité d'erreur, qui n'est pas sous le contrôle de votre code Java, doivent vous intercepter Error
ou Throwable
.
Je me souviens avoir attrapé Throwable pour signaler qu’une bibliothèque native n’était pas chargée.
Thowable
intercepte vraiment tout, même ThreadDeath, qui est lancé par défaut pour arrêter un thread à partir de la méthode désormais obsolète Thread.stop()
. Donc, en attrapant Throwable
, vous pouvez être sûr de ne jamais quitter le bloc try sans au moins passer par votre bloc catch, mais vous devez être prêt à gérer également OutOfMemoryError
et InternalError
ou StackOverflowError
.
Capturer Throwable
est particulièrement utile pour les boucles de serveur externe qui délèguent toutes sortes de requêtes à du code extérieur, mais ne peuvent jamais se terminer pour maintenir le service en vie.