Tout dépend un peu de ce que vous allez faire avec une erreur une fois que vous l'avez attrapée. En général, la capture d'une erreur ne doit pas être considérée comme faisant partie de votre flux d'exceptions "normal". Si vous en attrapez une, vous ne devriez pas penser à "continuer comme si rien ne s'était passé", parce que la JVM (et diverses bibliothèques) utiliseront les Erreurs comme un moyen de signaler que "quelque chose de vraiment sérieux s'est produit et que nous devons nous arrêter dès que possible". En général, il est préférable de les écouter lorsqu'elles vous disent que la fin est proche.
Un autre problème est que la récupération ou non d'une erreur peut dépendre de la machine virtuelle particulière, ce que vous pouvez ou non contrôler.
Cela dit, il existe quelques cas particuliers où il est sûr et/ou souhaitable de capturer les erreurs, ou du moins certaines sous-classes :
- Il y a des cas où vous voulez vraiment arrêter le cours normal du flux : par exemple, si vous êtes dans une servlet, vous ne voulez peut-être pas que le gestionnaire d'exception par défaut du programme d'exécution de la servlet annonce au monde entier que vous avez eu une OutOfMemoryError, que vous puissiez ou non vous en remettre.
- Occasionnellement, une erreur sera levée dans les cas où la JVM peut récupérer proprement la cause de l'erreur. Par exemple, si une erreur OutOfMemoryError se produit lors d'une tentative d'allocation d'un tableau, dans Hotspot au moins, il semble que vous puissiez vous en remettre en toute sécurité. (Il y a bien sûr d'autres cas où une OutOfMemoryError pourrait être lancée et où il n'est pas sûr d'essayer et de continuer).
En résumé, si vous attrapez un Throwable/Error au lieu d'une Exception, il faut que ce soit une un cas bien défini où vous savez que vous "faites quelque chose de spécial". .
Edit : Peut-être que c'est évident, mais j'ai oublié de le dire en pratique, la JVM pourrait ne pas invoquer votre clause "catch". sur une erreur. J'ai certainement vu Hotspot ignorer avec désinvolture les tentatives d'attraper certaines OutOfMemoryErrors et NoClassDefFoundError.