Beaucoup de fois dans les journaux Java, je vais obtenir quelque chose comme:
Caused by: Java.sql.BatchUpdateException: failed batch
at org.hsqldb.jdbc.jdbcStatement.executeBatch(jdbcStatement.Java:1102)
at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(jdbcPreparedStatement.Java:514)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.Java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.Java:242)
... 113 more
Est-ce que quelqu'un sait comment obtenir la totalité de la pile (c'est-à-dire afficher les 113 autres lignes)?
Les JavaDocs (pour Java 7) pour Throwable ont une explication assez détaillée de ce qui se passe.
Lorsque vous voyez "... 113 autres", cela signifie que les lignes restantes de l'exception "provoqué par" sont identiques aux lignes restantes à partir de ce point de l'exception parent.
Par exemple, vous aurez
com.something.XyzException
at ...
at ...
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.Java:242)
at ... <the other 113 lines are here>...
Caused by: <the above>.
Les deux traces de pile "se rencontrent" sur AbstractBatcher.executeBatch, ligne 242, puis à partir de là, la trace d'appel ascendante est identique à l'exception d'habillage.
Apache's Commons Lang fournit une méthode Nice util ExceptionUtils.printRootCauseStackTrace () qui affiche un stacktrace imbriqué "à l'envers". Le résultat est beaucoup plus intuitif.
Si vous voyez le résultat à côté de l'original en dehors de la méthode printStackTrace (), l'emplacement des «113 autres lignes» sera clairement indiqué.
J'aime l'exemple trouvé ici :
HighLevelException: MidLevelException: LowLevelException
at Junk.a(Junk.Java:13)
at Junk.main(Junk.Java:4)
Caused by: MidLevelException: LowLevelException
at Junk.c(Junk.Java:23)
at Junk.b(Junk.Java:17)
at Junk.a(Junk.Java:11)
... 1 more
Caused by: LowLevelException
at Junk.e(Junk.Java:30)
at Junk.d(Junk.Java:27)
at Junk.c(Junk.Java:21)
... 3 more
Essentiellement dans le code source, main
appelle function a
qui appelle function b
qui appelle ... qui appelle function e
.Function e
lève une LowLevelException
qui amène la fonction c à intercepter la LowLevelException
et à lancer une MidLevelException
(enveloppant l'instance LowLevelException
à l'intérieur de l'instance MidLevelException
La classe Exception
a un constructeur capable de prendre une exception différente, en l’enveloppant). Cela a pour effet que la fonction a attrape la MidLevelException
et jette une HighLevelException
qui enveloppe maintenant les deux précédentes instances Exception
.
Comme indiqué dans les autres réponses, la trace de la pile n'est pas vraiment tronquée, vous voyez la trace complète de la pile. Le .. .3 more
dans mon exemple est là car il serait redondant sinon. Si vous voulez être redondant et que les lignes de sortie sont vides, vous pouvez remplacer .. 3 more
par
at Junk.b(Junk.Java:17)
at Junk.a(Junk.Java:11)
at Junk.main(Junk.Java:4)
Mais il n'est pas nécessaire de sortir ces trois lignes, car elles sont déjà impliquées.
Augmentez l’option -XX:MaxJavaStackTraceDepth
de la machine virtuelle Java.
J'ai trouvé cela utile pour avoir une image complète. Obtenez une trace complète de la pile de l'exception et la cause (qui affiche souvent des lignes répétées de l'exception principale, mais peut être utile).
... catch( Exception e) ...
... catch( NoClassDefFoundError e)
{
for(StackTraceElement ste: e.getStackTrace())
{
System.out.println(ste);
}
if( e.getCause()!=null )
{
for(StackTraceElement ste: e.getCause().getStackTrace())
{
System.out.println(ste);
}
}
}