Il y a beaucoup de matériel out là ce qui suggère que l'impression de la trace de la pile d'une exception est une mauvaise pratique.
Par exemple, à partir de la vérification de RegexpSingleline dans Checkstyle :
Cette vérification peut être utilisée [...] pour trouver les mauvaises pratiques courantes telles que l'appel à ex.printStacktrace().
Cependant, j'ai du mal à trouver un endroit qui donne une raison valable, car la trace de la pile est certainement très utile pour trouver ce qui a causé l'exception. Les choses dont je suis conscient :
-
Une trace de pile ne devrait jamais être visible pour les utilisateurs finaux (pour des raisons d'expérience utilisateur et de sécurité).
-
La génération d'une trace de pile est un processus relativement coûteux (bien que peu susceptible d'être un problème dans la plupart des circonstances "exceptionnelles").
-
De nombreux frameworks de journalisation impriment la trace de la pile pour vous (le nôtre ne le fait pas et non, nous ne pouvons pas le changer facilement).
-
Imprimer la trace de la pile ne constitue pas une gestion des erreurs. Elle doit être combinée avec d'autres informations de journalisation et de gestion des exceptions.
Quelles sont les autres raisons pour éviter d'imprimer une trace de pile dans votre code ?
16 votes
En tant que personne devant régulièrement résoudre des problèmes, je voudrais jamais omettre l'impression d'une trace de pile lorsque quelque chose s'est mal passé. Oui, ne le montrez pas à l'utilisateur, mais oui, enregistrez-le dans un journal d'erreurs.
4 votes
Avez-vous vraiment besoin d'autres raisons ? Je pense que vous avez assez bien répondu à votre propre question. Cependant, le stacktrace devrait être imprimé dans les exceptions exceptionnelles :)
1 votes
Sujet à des erreurs va maintenant vous mettre en garde contre l'utilisation
.printStackTrace()
dans votre code :)0 votes
Pour éviter le problème d'enchevêtrement des flux de sortie évoqué par @Vineet Reynolds, vous pouvez l'imprimer sur la sortie standard :
e.printStackTrace(System.out);