C'è un modo per Throwable.printStackTrace(PrintStream s)
stampare l'intera traccia dello stack, in modo da poter vedere oltre la riga finale di "... 40 more"
?
C'è un modo per Throwable.printStackTrace(PrintStream s)
stampare l'intera traccia dello stack, in modo da poter vedere oltre la riga finale di "... 40 more"
?
Risposte:
Non è necessario; quell'informazione è presente altrove nell'analisi dello stack. Dai documenti di printStackTrace()
:
Notare la presenza di righe contenenti i caratteri
"..."
. Queste righe indicano che il resto dell'analisi dello stack per questa eccezione corrisponde al numero di frame indicato dalla fine dell'analisi dello stack dell'eccezione causata da questa eccezione (l'eccezione "di chiusura").Questa scorciatoia può ridurre notevolmente la lunghezza dell'output nel caso comune in cui viene generata un'eccezione racchiusa dallo stesso metodo in cui viene rilevata l '"eccezione causale".
In altre parole, "... x more"
appare solo su un'eccezione concatenata e solo quando le ultime x
righe dell'analisi dello stack sono già presenti come parte dell'analisi dello stack di un'altra eccezione concatenata.
Supponiamo che un metodo catturi l'eccezione Foo, la racchiuda in un'eccezione Bar e lanci Bar. Quindi la traccia dello stack di Foo verrà ridotta. Se per qualche motivo vuoi la traccia completa, tutto ciò che devi fare è prendere l'ultima riga prima della ...
traccia dello stack di Foo e cercarla nella traccia dello stack del Bar; tutto al di sotto di quella linea è esattamente ciò che sarebbe stato stampato nella traccia dello stack di Foo.
Prendiamo la traccia dello stack dalla documentazione di 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
Le cause vengono visualizzate da quella più annidata in basso (la "causa principale"), a quella a cui appartiene la traccia dello stack stampata.
In questo caso la causa principale è LowLevelException
, che ha causato MidLevelException
, che ha causato HighLevelException
.
Per ottenere la traccia dello stack completa devi guardare i frame dell'eccezione che lo racchiude (e le sue eccezioni che lo racchiudono):
Quindi, se volessimo ottenere la traccia completa dello stack, LowLevelException
dovremmo fare quanto segue:
MidLevelException
)
MidLevelException
( HighLevelException
)La tua traccia dello stack completa sarà quindi simile a questa:
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)
Note a margine:
Potrebbero verificarsi casi in cui non è elencato alcun frame, ad esempio:
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
Questo può accadere quando la causa ha creato nella stessa linea: new HighLevelException(new MidLevelException())
. Non lasciarti confondere da questo, l'approccio descritto sopra funziona ancora, non ci sono solo frame da usare dall'eccezione, continua con quello che lo racchiude.
In alcuni casi puoi salvarti il conteggio guardando il primo fotogramma che non è stato omesso (la riga sopra ... X more
). Se sai quali metodi chiamano il metodo in quella riga, puoi cercare direttamente i chiamanti nei frame dell'eccezione che lo racchiude:
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
...
è il primo fotogramma che differisce. Tuttavia sarà almeno nella stessa classe che aiuta a trovarlo.