web-dev-qa-db-fra.com

Différence entre e.printStackTrace et System.out.println (e)

Probablement une question de débutant, mais tout le monde semble utiliser e.printStackTrace(), mais j'ai toujours utilisé System.out.println(e) pour la gestion des exceptions. Quelle est la différence et pourquoi e.printStackTrace() est-il préférable?

27
imulsion

Le flux de sortie utilisé n’est pas le même que celui souligné par @Brian, mais le niveau de détail n’est pas le même: vous pouvez essayer avec le test simple ci-dessous. Sortie:

Avec println: vous savez uniquement quelle exception a été levée

Java.lang.UnsupportedOperationException: Pas encore implémenté 

Avec printStackTrace: vous savez également ce qui l’a provoquée (numéros de ligne + pile d’appel)

Java.lang.UnsupportedOperationException: Pas encore implémenté
à javaapplication27.Test1.test (Test1.Java:27)
à javaapplication27.Test1.main (Test1.Java:19)

public static void main(String[] args){
    try {
        test();
    } catch (UnsupportedOperationException e) {
        System.out.println(e);
        e.printStackTrace();
    }
}

private static void test() {
    throw new UnsupportedOperationException("Not yet implemented");
}
37
assylias

Si vous utilisez System.out.println, vous exportez vos erreurs dans la variable stdout et non pas stderr.

Il est de tradition de convertir les erreurs en erreur standard, vous pouvez donc filtrer la sortie réussie normale de la sortie d'erreur. C'est une pratique courante pour les utilitaires de ligne de commande et, par conséquent, une bonne idée à suivre.

par exemple.

myCommand 2> /tmp/errors > /tmp/results

écrira les erreurs dans un journal et les résultats dans un autre. Selon votre processus Shell/appelant, etc., vous pouvez combiner ces informations, supprimer les erreurs, réagir en cas d'erreur, etc. Voir ici pour plus d'informations.

Utiliser printStackTrace() est une bonne idée puisque vous effectuez un dumping là où l'exception a eu lieu. Cela est souvent très utile pour le suivi des erreurs inattendues car cela vous donnera un pointeur direct (si détaillé) sur l'endroit où vous avez rencontré une erreur.

7
Brian Agnew

System.out.println(e) est équivalent à System.out.println(e.toString()): System.out est un PrintStream, PrintStream.println(Object o) appelle PrintStream.println(o.toString()).

e.toString() renvoie le nom de la classe et la méthode getLocalizedMessage () de l'exception.

e.printStackTrace() écrit ces informations dans System.err (pas System.out) et aussi une trace de pile, c'est-à-dire la chaîne de méthodes ayant conduit à l'exception. C'est une information utile.

J'ai souvent pensé que ce serait bien s'il existait une méthode qui renvoie une chaîne contenant les informations générées par e.printStackTrace(). Puisqu'il n'y en a pas, vous devez utiliser e.getStackTrace() et écrire votre propre routine pour générer le tableau résultant de StackTraceElements.

4
slim

System.out.println(e) ne vous donnera pas votre trace de pile, mais simplement le message d'erreur et le type d'exception, ainsi que l'impression sur la sortie standard, par opposition à la sortie d'erreur.

1
tofarr

Étant donné que la sortie de e.printStackTrace(); est System.err et que, généralement, le journal de mes applications est consigné dans un fichier, il est recommandé d’utiliser System.err et System.out pour générer des erreurs.

public static void log(Exception e) {
    e.printStackTrace(); // This goes to System.err
    e.printStackTrace(System.out);
}

De cette façon, vous pouvez voir les erreurs dans le fichier journal (si vous en avez un) et dans la console.

1
Toni Almeida

Le programme ci-dessous montre les détails de la différence

System.out.println (e); : - ne montrant que l'exception . par exemple, Java.lang.ArithmeticException:/by zero e.printStackTrace (); : - montrant les détails de l'exception et où provoquer une exception dans le programme avec un numéro de ligne, par exemple . Exception Java.lang.Arithmetic:/par zéro à test.Test.main (Test.Java:7)

test de l'emballage;

classe publique Test {

public static void main(String args[]) {
    try {
        System.out.println(12 / 0);

    } catch (Exception e) {
        System.out.println(e);
        e.printStackTrace();
    }

}

}

0
MAnoj Sarnaik