web-dev-qa-db-fra.com

Évitez printStackTrace (); utiliser un appel de journal à la place

Dans mon application, j'exécute mon code via PMD.Il me montre ce message:

  • Évitez printStackTrace (); utilisez plutôt un appel logger.

Qu'est-ce que ça veut dire?

62
user1305398

Cela signifie que vous devez utiliser une structure de journalisation telle que logback ou log4j et au lieu d’imprimer directement les exceptions:

e.printStackTrace();

vous devriez les enregistrer en utilisant l'API de ce framework:

log.error("Ops!", e);

Les infrastructures de journalisation vous offrent une grande flexibilité, par exemple vous pouvez choisir si vous souhaitez vous connecter à la console ou au fichier - ou peut-être ignorer certains messages si vous les trouvez ne sont plus pertinents dans certains environnements.

108

Si vous appelez printStackTrace() sur une exception, la trace est écrite dans System.err Et il est difficile de l'acheminer ailleurs (ou de le filtrer). Au lieu de cela, il vous est conseillé d'utiliser un framework de journalisation (ou un wrapper autour de plusieurs frameworks de journalisation, comme Apache Commons Logging) et de consigner l'exception à l'aide de ce framework (par exemple, logger.error("some exception message", e)).

Cela vous permet de:

  • écrivez l'instruction de journal à différents endroits à la fois, par ex. la console et un fichier
  • filtrer les instructions de journal par gravité (erreur, avertissement, information, débogage, etc.) et par origine (normalement basée sur le package ou la classe)
  • avoir une influence sur le format du journal sans avoir à changer le code
  • etc.
35
Thomas

Un programme de qualité de production doit utiliser l’une des nombreuses alternatives de journalisation (par exemple, log4j, logback, Java.util.logging) pour signaler les erreurs et autres diagnostics. Cela présente de nombreux avantages:

  • Les messages de journal sont envoyés à un emplacement configurable.
  • L'utilisateur final ne voit pas les messages, sauf si vous configurez la journalisation pour qu'il le fasse.
  • Vous pouvez utiliser différents enregistreurs et niveaux de journalisation, etc. pour contrôler la quantité de journalisation enregistrée.
  • Vous pouvez utiliser différents formats d'appender pour contrôler l'aspect de la journalisation.
  • Vous pouvez facilement brancher la sortie de journalisation dans un cadre de surveillance/journalisation plus vaste.
  • Tout ce qui précède peut être fait sans changer votre code; c'est-à-dire en modifiant le fichier de configuration de journalisation de l'application déployée.

En revanche, si vous utilisez uniquement printStackTrace, le déployeur/utilisateur final dispose de peu de contrôle, voire aucun, et les messages de journalisation risquent d'être perdus ou d'être montrés à l'utilisateur final dans des circonstances inappropriées. (Et rien ne terrifie davantage un utilisateur timide qu'une trace de pile aléatoire.)

16
Stephen C

Dans Simple, e.printStackTrace () n’est pas une bonne pratique, car il n’imprime que la trace de pile dans l’erreur standard. Pour cette raison, vous ne pouvez pas vraiment contrôler où va cette sortie.

5
Sandip S.

Presque chaque framework de journalisation fournit une méthode dans laquelle nous pouvons transmettre l'objet jetable avec un message. Comme:

public trace(Marker marker, String msg, Throwable t);

Ils impriment le stacktrace de l'objet jetable.

1
abhi shukla

Parlons du concept d'entreprise. Log vous offre des niveaux flexibles (voir Différence entre logger.info et logger.debug ). Différentes personnes souhaitent voir différents niveaux, tels que les QA, les développeurs, les hommes d’affaires. Mais e.printStackTrace () imprimera tout. De même, comme si cette méthode était appelée reposante, cette même erreur pouvait s’imprimer plusieurs fois. Dans ce cas, les membres de Devops ou de Tech-Ops de votre entreprise risquent d’être fous, car ils recevront les mêmes rappels d’erreur. Je pense qu'un meilleur remplacement pourrait être log.error("errors happend in XXX", e) Ceci affichera également des informations complètes, ce qui facilite la lecture par rapport à e.printStackTrace ()

0
Qiyu Zhang