2009-01-13 12 views
66

Un sacco di volte nei registri Java vado a prendere qualcosa di simile:Come arresto stacktraces troncando in ceppi

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 

Qualcuno sa come ottenere lo stacktrace completo che mostra (cioè Vedere gli altri 113 linee)?


Il JavaDocs (for Java 7) per Throwable hanno una spiegazione piuttosto dettagliata di quello che sta succedendo.

risposta

66

Quando viene visualizzato "... 113 more", significa che le restanti righe dell'eccezione 'causato da' sono identiche alle righe rimanenti da quel punto sull'eccezione genitore.

Per esempio, avrete

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>. 

Le due tracce dello stack 'incontrare' a AbstractBatcher.executeBatch, la linea 242, e poi da lì in poi il tracciamento delle chiamate verso l'alto è lo stesso che l'eccezione di avvolgimento.

+0

Cosa? La causa è la stessa dell'eccezione wrapping? Non l'ho capito ... Il couse dovrebbe mostrare la linea da cui proviene il problema, cosa non mostra quando tronca lo stacktrace. Sto avendo questo problema e vorrei capire questa risposta, se qualcuno potesse riformularlo ... Grazie!A proposito, questa risposta sembra non mostrare come stampare lo stacktrace completo. –

+20

@TomBrito STAI vedendo lo stacktrace completo: hai due eccezioni, una dentro l'altra. Se la traccia dello stack dell'eccezione interna (avvolta) è ABCDEFG e la traccia dello stack dell'eccezione esterna è ABCZ, verrà visualizzato OuterException con lo stack ZCBA dello stack, "causato da" InnerException con lo stack trace "GFEDC ..." poi altri 2 '". Quelli altri 2 sono A e B, dalla traccia di stack esterna, e sono omessi per brevità. – Cowan

19

Apache Commons Lang fornisce un utile metodo ExceptionUtils.printRootCauseStackTrace() che stampa uno stacktrace nidificato "capovolto". Il risultato è molto più intuitivo.

Se si vede il risultato accanto all'originale al di fuori del metodo printStackTrace(), sarà chiaro dove sono andate le linee "113 in più".

-2

In un post del blog ho appena descritto how to get more than just "BatchUpdateException: failed batch": impostare hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory per disabilitare il batching in sospensione. Normalmente si può usare BatchUpdateException.getNextException per ottenere il motivo dell'errore, ma in alcuni casi questo può restituire null. Quindi è utile disabilitare completamente il batching.

+0

Questo non risponde alla domanda. Può risolvere la sua situazione nella vita reale, quindi aggiungerla come commento alla sua domanda potrebbe essere più utile della pubblicazione di una risposta –

10

mi piace l'esempio trovato here:

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 

In sostanza nel codice sorgente, main chiamate function a che chiama function b che chiede ... che chiama function e. Function e getta un LowLevelException che provoca funzione c per prendere il LowLevelException e lanciare un MidLevelException (avvolgendo l'istanza LowLevelException all'interno dell'istanza MidLevelException. La classe Exception ha un costruttore che è in grado di prendere in un'eccezione diversa, avvolgendolo). Questo fa sì che la funzione a catturi lo MidLevelException e lanci uno HighLevelException che ora avvolge le due precedenti Exception istanze.

Come indicato nelle altre risposte, la traccia dello stack non è realmente troncata, viene visualizzata la traccia dello stack completo. Il .. .3 more nel mio esempio è lì perché altrimenti sarebbe ridondante. Se si voleva essere linee di uscita ridondanti e rifiuti, .. 3 more potrebbe essere sostituito con

at Junk.b(Junk.java:17) 
at Junk.a(Junk.java:11) 
at Junk.main(Junk.java:4) 

Ma non v'è alcuna necessità di uscita queste tre linee, perché sono già implicita.

Problemi correlati