11
votes

Quel est le problème avec E.PrintStackTrace () pour une exception inconnue

Si j'utilise un enregistreur dans le cas d'exceptions connues, qu'est-ce qui ne va pas avec e.printstacktrace () pour une exception inconnue?

On me dit toujours de ne pas le faire - mais pas Compte tenu d'une raison

exemple ci-dessous xxx


0 commentaires

6 Réponses :


15
votes

Parce que cela n'utilise pas le système d'enregistrement, il va directement au starr qui doit être évité.

EDIT: Pourquoi écrire directement à stardr doit être évitée?

En réponse à votre question, @ hinynewbike, j'ai légèrement modifié ma réponse. Ce qu'il faut éviter, c'est écrire directement à starr sans utiliser de Capacité .

enregistreurs Fournissez des fonctionnalités utiles pour modifier les traces de la journalisation par priorité et des paquets, entre autres choses, ils permettent également de rediriger des traces à différents mécanismes de sortie ... files d'attente, de fichiers, de bases de données, de flux ... < / p>

Lorsque vous écrivez directement sur system.err ou system.out alors vous perdez ces fonctionnalités, et ce qui est pire si vous mélangez enregistreur et system.err.write Vous pouvez finir par obtenir des traces dans différents "fichiers" qui faciliteront le débogage de votre système difficile.


3 commentaires

Je pense que vous voulez dire stardr ou system.err ;)


Parce que l'enregistreur est configuré pour le regarder, personne ne verra STDERR.


@shinyNewBike Voir la réponse dans la nouvelle édition de la réponse, espérons qu'il clarifie.



7
votes

IMHO, vous devriez

  • Connectez-vous toujours à un enregistreur ou une erreur standard, mais pas un mélange (peut-être que c'est la raison de la plainte)
  • Toujours journal d'exception avec la trace de la pile, sauf si vous n'êtes pas sûr de ne jamais en avoir besoin.

0 commentaires

0
votes

Tout d'abord, l'impression de la trace de la pile ne résout pas le problème et le problème ne signalera probablement pas au fil parent pour une manipulation ultérieure. Ma suggestion est que vous gérez l'exception dans la clause de capture, en identifiant le type d'exception dans le programme utilisant E.getClass (). GetName ().


0 commentaires

1
votes

attrape (exception e) attrape toutes les exceptions même les non cochées qui ne sont pas cochées à partir de runtimeexception comme nullpointException ou indexOutOfboundSException Et le programme continue ensuite de courir même s'il est fort probable que vous ne le souhaitez pas, car ceux-ci sont souvent fatals et peuvent quitter le flux de contrôle à des positions inattendues.

Si vous attendez une de ces exceptions non cochées, vous devriez explicitement attraper ce type d'exception et le gérer.


0 commentaires

2
votes

Une des choses que le cadre de journalisation vous donne est une abstraction puissante sur l'endroit où vos messages de journal sont enfin de la production. Vous pouvez penser que vous pouvez obtenir la même chose avec une erreur standard et standard, mais ce n'est pas toujours le cas. Dans de nombreux environnements, le développeur n'a aucun contrôle sur ce qui arrive aux flux IO standard dans une application.

Le scénario le plus courant est que votre application s'exécute à l'intérieur d'un autre conteneur tel que Tomcat, ce qui peut émettre ses propres messages à la norme. Étant donné que votre application est exécutée dans le même processus, tous vos messages seront mélangés avec le conteneur, ainsi que les messages d'une autre application exécutant dans le même conteneur.

L'utilisation d'une bibliothèque de journalisation donne à votre application la flexibilité pour enregistrer des messages à un certain nombre de destinations différentes pouvant être configurées par le déployeur. Vous n'obtiendrez pas cet avantage lorsque vous utilisez E.PrintStackTrace () .

Il y a quelques autres problèmes soulevés par l'exemple que vous avez donné BTW. Certaines questions de suivi peuvent être:

  • Quand est-ce que ça va de attrape (exception ex) ?
  • Quand / comment faut des exceptions?

0 commentaires

3
votes

Ceci est mauvais car E.PrintStackTrace () code> n'écrira pas nécessairement dans le même fichier journal que logger.error () code> pour la cohérence, vous devez utiliser LOGGER.Error () Code> Pour TOUT.

NOR DU E.PRITITSACKTRACE () CODE> TOW Décrivez EM> Qu'est-ce qui se passait qui a provoqué l'erreur. Vous devez toujours inclure un message de journal qui précisera la personne qui lit la personne qui lit le fichier journal. P>

Si vous envoyez l'objet d'exception comme deuxième paramètre, vous obtiendrez la trace de la pile dans votre fichier journal. , ainsi que la chaîne de message de l'exception. La pauvre âme lisant le fichier journal sera heureux d'avoir cette information disponible. P>

try {
    doStuff();
}
catch (AException ae) {

    // Send to the log file a message describing what we were doing,
    // and what happened as a result

    logger.error("ae happened, while attempting to do stuff, but that's okay", ae);

    dealWithTheSituation();
}
catch (Exception e) {

    logger.fatal("an unexpected error happened, while attempting to do stuff, cannot proceed", e);

    abortAndCatchFire();  // Burn the evidence
}


1 commentaires

Grand exemple pratique et toujours pertinent 9 ans plus tard