43 votes

Imprimer la pile d'appels complète sur printStackTrace ()?

J'ai besoin d'écrire un petit journal de l'analyseur d'application pour traiter certains fichiers journaux générés par une 3ème partie fermée de la source de la bibliothèque (avoir personnalisé l'enregistreur à l'intérieur) utilisé dans mon projet.

Dans le cas d'une entrée d'exception dans le journal j'ai besoin de recueillir des informations agrégées sur les méthodes, le long de la trace de la pile à partir du haut vers le lieu effectif de l'exception.

Malheureusement, par défaut, Java printStackTrace() n'a pas l'impression de chaque méthode dans la pile d'appel, mais jusqu'à un certain nombre, et le reste est tout simplement la référence de 16 more....

Si je pouvais attraper l'exception de moi, je voudrais utiliser le getStackTrace() et de l'imprimer moi-même, mais la cause n'est jamais inclus dans la seule exception de la bibliothèque de jette.

Est-il un moyen de demander à Java pour imprimer la totalité de la pile d'appel dans le stacktrace?

En dehors de ma situation n'commune de journalisation des cadres de l'option pour le ce?

Edit: Le programme s'exécute sur Sun JVM avec JDK 1.5.0_09. Pas d'option pour changer cela.

30voto

akf Points 23518

voici une explication de la "provoquée par "et" ... n plus de lignes dans la version imprimée de trace. voir aussi la JavaDoc pour printStackTrace. vous pourriez ne pas avoir de travail à faire.

A noter la présence de lignes contenant les caractères "...". Ces lignes indiquent que le reste de la trace de la pile pour cette exception correspond à l'indication du nombre d'images à partir du bas de la trace de la pile de l'exception qui a été causé par cette exception (les "enfermer" l'exception"). Ce raccourci permet de réduire considérablement la longueur de la sortie dans le cas courant où un enveloppé exception est levée à partir de la même méthode que le "causal" l'exception est interceptée.

5voto

A_M Points 2897

Ne pouvez-vous pas faire quelque chose avec Thread.currentThread().getStackTrace() ?

Voici un exemple simple qui appelle une méthode de manière récursive 20 fois, puis vide la pile du thread actuel.

 public class Test {
    public static void main(String[] args) {
        method();
    }

    static int x = 0;
    private static void method() {
        if(x>20) {
            StackTraceElement[] elements = Thread.currentThread().getStackTrace();

            for(int i=0; i<elements.length; i++) {
                System.out.println(elements[i]);
            }
        }
        else {
            x++;
            method();
        }
    }
}
 

-1voto

Manuel Selva Points 5760

Peut-être que vous pouvez essayer de parcourir le tableau retourné par:

 Thread.currentThread().getStackTrace();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X