Si j'utilise un enregistreur dans le cas d'exceptions connues, qu'est-ce qui ne va pas avec On me dit toujours de ne pas le faire - mais pas Compte tenu d'une raison p> exemple ci-dessous p> e.printstacktrace () code> pour une exception inconnue?
6 Réponses :
Parce que cela n'utilise pas le système d'enregistrement, il va directement fort> au En réponse à votre question, @ hinynewbike, j'ai légèrement modifié ma réponse. Ce qu'il faut éviter, c'est écrire directement strud> à Lorsque vous écrivez directement sur starr code> qui doit être évité. P>
starr code> sans utiliser de code> Capacité code>. p>
enregistreurs code> 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>
system.err code> ou
system.out code> alors vous perdez ces fonctionnalités, et ce qui est pire si vous mélangez
enregistreur code> et
system.err.write code> Vous pouvez finir par obtenir des traces dans différents "fichiers" qui faciliteront le débogage de votre système difficile. P>
Je pense que vous voulez dire stardr code> ou
system.err code>;)
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.
IMHO, vous devriez P>
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 (). P>
Si vous attendez une de ces exceptions non cochées, vous devriez explicitement attraper ce type d'exception et le gérer. P> attrape (exception e) code> attrape toutes les exceptions même les non cochées qui ne sont pas cochées à partir de
runtimeexception code> comme
nullpointException code> ou
indexOutOfboundSException code > 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. p>
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. p>
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. P>
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 Il y a quelques autres problèmes soulevés par l'exemple que vous avez donné BTW. Certaines questions de suivi peuvent être: p>
E.PrintStackTrace () code>. P>
attrape (exception ex) code>? li>
Ceci est mauvais car NOR DU 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> 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.
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>
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
}
Grand exemple pratique et toujours pertinent 9 ans plus tard