Parfois, je vois
try {
} catch(Throwable e) {
}
Et parfois
try {
} catch(Exception e) {
}
Quelle est la différence?
Parfois, je vois
try {
} catch(Throwable e) {
}
Et parfois
try {
} catch(Exception e) {
}
Quelle est la différence?
Réponses:
En attrapant, Throwable
il 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.
throw new Throwable();
, c'est donc le seul moyen de tout saisir vraiment.
La première capture toutes les sous-classes de Throwable
(cela inclut Exception
et Error
), la seconde capture toutes les sous-classes de Exception
.
Error
est 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). Exception
est 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.
Error
et 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"
programmatically unrecoverable
signifie 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?
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.
Thowable
attrape 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, Throwable
vous 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 OutOfMemoryError
et InternalError
ou StackOverflowError
.
La capture Throwable
est 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.
Throwable
est super classe de Exception
ainsi 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 Error
ou Throwable
.
Je me souviens avoir attrapé Throwable pour signaler qu'une bibliothèque native n'est pas chargée.