Existe-t-il un moyen de faire Throwable.printStackTrace(PrintStream s)
imprimer la trace de la pile complète, de sorte que je puisse voir au-delà de la dernière ligne de "... 40 more"
?
Existe-t-il un moyen de faire Throwable.printStackTrace(PrintStream s)
imprimer la trace de la pile complète, de sorte que je puisse voir au-delà de la dernière ligne de "... 40 more"
?
Réponses:
Vous n'en avez pas besoin; cette information est présente ailleurs dans la trace de pile. D'après la documentation de printStackTrace()
:
Notez la présence de lignes contenant les caractères
"..."
. Ces lignes indiquent que le reste de la trace de pile pour cette exception correspond au nombre de trames indiqué à partir du bas de la trace de pile de l'exception qui a été provoquée par cette exception (l'exception «englobante»).Ce raccourci peut réduire considérablement la longueur de la sortie dans le cas courant où une exception encapsulée est levée à partir de la même méthode que "l'exception causale" est interceptée.
En d'autres termes, le "... x more"
n'apparaît que sur une exception chaînée, et uniquement lorsque les dernières x
lignes de la trace de pile sont déjà présentes dans le cadre de la trace de pile d'une autre exception chaînée.
Supposons qu'une méthode intercepte l'exception Foo, l'encapsule dans l'exception Bar et lève Bar. Ensuite, la trace de pile de Foo sera raccourcie. Si, pour une raison quelconque, vous voulez la trace complète, tout ce que vous avez à faire est de prendre la dernière ligne avant la ...
trace de pile de Foo et de la rechercher dans la trace de pile de la barre; tout ce qui se trouve en dessous de cette ligne est exactement ce qui aurait été imprimé dans la trace de pile de Foo.
Prenons la trace de la pile de la documentation de Throwable.printStackTrace () :
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
Les causes sont affichées de la plus imbriquée en bas (la «cause racine») à celle à laquelle appartient la trace de pile imprimée.
Dans ce cas, la cause première est LowLevelException
, qui a causé MidLevelException
, qui a causé HighLevelException
.
Pour obtenir la trace complète de la pile, vous devez regarder les cadres de l'exception englobante (et ses exceptions englobantes):
Donc, si nous voulions obtenir la trace complète de la pile, LowLevelException
nous ferions ce qui suit:
MidLevelException
)
MidLevelException
( HighLevelException
)Votre trace de pile complète ressemble alors à ceci:
LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
// From MidLevelException stack trace
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
// From HighLevelException stack trace
at Junk.main(Junk.java:4)
Notes secondaires:
Il peut y avoir des cas où aucun cadre n'est répertorié, par exemple:
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
Cela peut se produire lorsque la cause qu'il a créé dans la même ligne: new HighLevelException(new MidLevelException())
. Ne soyez pas confus par cela, l'approche décrite ci-dessus fonctionne toujours, il n'y a tout simplement pas de trames à utiliser pour l'exception, continuez avec celle qui l'entoure.
Dans certains cas, vous pouvez enregistrer vous-même le comptage en regardant la première image qui n'a pas été omise (la ligne ci-dessus ... X more
). Si vous savez quelles méthodes appellent la méthode dans cette ligne, vous pouvez directement rechercher les appelants dans les cadres de l'exception englobante:
HighLevelException: MidLevelException: LowLevelException
at Junk.c(Junk.java:29)
at Junk.b(Junk.java:21)
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException
// You know Junk.d is only called by Junk.b
at Junk.d(Junk.java:35)
... 3 more
...
est la première image qui diffère. Cependant, il sera au moins dans la même classe qui aide à le trouver.