Évitez printStackTrace (); utilisez plutôt un appel de journal

Dans mon application, je lance mon code via PMD. Il me montre ce message:

  • Évitez printStackTrace (); utilisez plutôt un appel de journal

Qu’est-ce que ça veut dire?

Cela signifie que vous devez utiliser un framework de journalisation tel que logback ou log4j et au lieu d’imprimer des exceptions directement:

e.printStackTrace(); 

vous devriez les connecter en utilisant l’API de ce framework:

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

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

Si vous appelez printStackTrace() sur une exception, la trace est écrite dans System.err et il est difficile de la router ailleurs (ou de la filtrer). Au lieu de faire cela, vous devez utiliser une structure de journalisation (ou un wrapper autour de plusieurs frameworks de journalisation, comme Apache Commons Logging) et enregistrer l’exception en utilisant cette structure (par exemple, logger.error("some exception message", e) ).

Faire cela vous permet de:

  • écrire l’instruction de journal à différents endroits en même temps, par exemple la console et un fichier
  • filtrer les instructions du journal en fonction de la gravité (erreur, avertissement, info, débogage, etc.) et de l’origine (normalement en fonction du package ou de la classe)
  • avoir une certaine influence sur le format du journal sans avoir à changer le code
  • etc.

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

  • Les messages du journal vont dans un emplacement configurable.
  • L’utilisateur final ne voit pas les messages à moins que vous ne configuriez la journalisation pour qu’il / elle le fasse.
  • Vous pouvez utiliser différents enregistreurs et niveaux de journalisation, etc. pour contrôler la quantité d’enregistrement peu ou pas enregistrée.
  • Vous pouvez utiliser différents formats d’appli pour contrôler l’apparence de la journalisation.
  • Vous pouvez facilement twigr la sortie de journalisation dans une infrastructure de surveillance / journalisation plus grande.
  • Tout ce qui précède peut être fait sans changer votre code; c’est-à-dire en éditant le fichier de configuration de journalisation de l’application déployée.

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

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

Presque tous les frameworks de journalisation fournissent une méthode permettant de transmettre l’object jetable avec un message. Comme:

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

Ils impriment la trace de l’object jetable.

La principale raison est que Proguard supprime les appels de journal de la production. Parce qu’en enregistrant ou en imprimant StackTrace, il est possible de les voir (informations à l’intérieur de la trace de la stack ou du journal) dans le téléphone Android, par exemple par l’application Logcat Reader. Donc, c’est une mauvaise pratique pour la sécurité. De plus, nous n’y accédons pas pendant la production, il serait préférable de se retirer de la production. Au fur et à mesure que ProGuard supprime tous les appels de journal, il est préférable d’utiliser Log Blocks Blocks et de les supprimer de Production by Proguard.