Évitez printStackTrace (); utilisez un appel de logger à la place

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

  • évitez printStackTrace (); utilisez un appel logger à la place.

Qu'est-ce que cela signifie?

51
demandé sur Tomasz Nurkiewicz 2012-05-07 10:23:57

6 réponses

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

e.printStackTrace();

Vous devez les enregistrer en utilisant L'API de ce framework:

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

Les frameworks de journalisation vous donnent beaucoup de flexibilité, par exemple vous pouvez choisir si vous voulez vous connecter à la console ou au fichier - ou peut-être ignorer certains messages si vous les trouvez plus pertinents dans un environnement.

97
répondu Tomasz Nurkiewicz 2013-02-14 07:43:23

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, 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 en utilisant ce framework (par exemple logger.error("some exception message", e)).

Cela vous permet de:

  • écrivez l'instruction log à différents emplacements à la fois, par exemple la console et un fichier
  • filtrer les instructions du journal par gravité (erreur, avertissement, info, débogage, etc.) et origine (normalement basée sur un paquet ou une classe)
  • avoir une certaine influence sur le format du journal sans avoir à changer le code
  • etc.
32
répondu Thomas 2012-05-07 06:31:42

UN programme de qualité de production doit utiliser l'une des nombreuses alternatives de journalisation (par exemple log4j, logback, java.util.journalisation) pour signaler les erreurs et autres diagnostics. Cela présente un certain nombre d'avantages:

  • Les messages du journal vont à un emplacement configurable.
  • l'utilisateur final ne voit pas les messages sauf si vous configurez la journalisation de manière à ce qu'il/elle le fasse.
  • vous pouvez utiliser différents enregistreurs et niveaux de journalisation, etc. pour contrôler combien peu ou beaucoup de journalisation est enregistrée.
  • vous peut utiliser différents formats d'appender pour contrôler à quoi ressemble la journalisation.
  • vous pouvez facilement brancher la sortie de journalisation dans un cadre de surveillance / journalisation plus large.
  • 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, le déployeur / utilisateur final a peu ou pas de contrôle, et les messages de journalisation sont susceptibles d'être perdus ou affichés à l'utilisateur final dans circonstances inappropriées. (Et rien ne terrifie un utilisateur timide plus qu'une trace de pile aléatoire.)

15
répondu Stephen C 2012-05-07 06:38:27

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

4
répondu Sandip S. 2017-09-12 09:11:12

Presque tous les journalisation fournit une méthode dans laquelle nous pouvons passer l'objet throwable, avec un message. Comme:

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

Ils impriment la stacktrace de l'objet throwable.

1
répondu abhi shukla 2018-03-01 16:22:11

La raison principale est que Proguard supprimerait les appels de journal de la production. Parce qu'en enregistrant ou en imprimant StackTrace, il est possible de les voir (informations dans stack trace ou Log) dans le téléphone Android par exemple L'application Logcat Reader. Alors que c'est une mauvaise pratique pour la sécurité. En outre, nous n'y accédons pas pendant la production, il serait préférable de se retirer de la production. Comme ProGuard supprimer tous les appels de journal pas stackTrace, il est donc préférable d'utiliser log dans les blocs de capture et laisser ils ont été retirés de la Production par Proguard.

0
répondu Amirhossein Hashemi 2018-07-04 00:01:09