2009-01-13 6 views
66

Muchas veces en los registros de Java voy a conseguir algo como:¿Cómo paro stacktraces truncar en los registros de

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 

¿Alguien sabe cómo conseguir la plena StackTrace muestra (es decir, mostrar la otra 113 líneas)?


El JavaDocs (for Java 7) de Throwable tienen una explicación muy detallada de lo que está pasando.

Respuesta

66

Cuando vea '... 113 more', eso significa que las líneas restantes de la excepción 'causada por' son idénticas a las líneas restantes desde ese punto en adelante de la excepción padre.

Por ejemplo, tendrá

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

Los dos se encuentran trazas de pila '' en AbstractBatcher.executeBatch, línea 242, y luego a partir de entonces el rastreo de llamadas hacia arriba es la misma que la excepción de envolver.

+0

¿Qué? La causa es la misma que la excepción de envoltura? No lo obtuve ... El código debe mostrar la línea de donde proviene el problema, lo que no se muestra al truncar la pila. Tengo este problema y me gustaría entender esta respuesta, si alguien pudiera reformularla ... ¡Gracias!Por cierto, esta respuesta parece no mostrar cómo imprimir la pila completa. –

+20

@TomBrito ESTÁS viendo la stacktrace completa; tienes dos excepciones, una dentro de la otra. Si la traza de la pila de la excepción interna (envuelta) es ABCDEFG, y la traza de la pila de la excepción externa es ABCZ, entonces verá OuterException con el trazo de pila ZCBA, "causado por" InnerException con el seguimiento de pila "GFEDC ..." luego 2 más '". Esos 2 más son A y B, del rastro de la pila exterior, y se omiten por brevedad. – Cowan

19

Apache's Commons Lang proporciona un buen método util ExceptionUtils.printRootCauseStackTrace() que imprime un stacktrace anidado 'al revés'. El resultado es mucho más intuitivo.

Si ve el resultado al lado del original del método printStackTrace(), quedará claro a dónde fueron las '113 líneas más'.

-2

En una publicación de blog Acabo de describir how to get more than just "BatchUpdateException: failed batch": configure hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory para deshabilitar el procesamiento por lotes en Hibernate. Normalmente se puede usar BatchUpdateException.getNextException para obtener el motivo de la falla, pero en algunos casos esto puede devolver null. Entonces es útil deshabilitar el procesamiento por lotes por completo.

+0

Esto no responde la pregunta. Puede resolver su situación en la vida real, por lo que agregarla como comentario a su pregunta podría ser más útil que publicar una respuesta –

10

Me gusta el ejemplo encontró 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 

Básicamente en el código fuente, main llama function a la que se pide que se pide ... function b que exige function e. Function e tiros un LowLevelException que hace que la función de c para coger el LowLevelException y lanzar una MidLevelException (envolviendo la instancia LowLevelExceptionMidLevelException interior de la instancia. La clase Exception tiene un constructor que es capaz de tomar en una excepción diferente, envolviéndolo). Esto hace que la función a capture el MidLevelException y arroje un HighLevelException que ahora envuelve las dos instancias previas de Exception.

Como se señala en las otras respuestas, el seguimiento de la pila no está realmente truncado, está viendo el seguimiento completo de la pila. El .. .3 more en mi ejemplo está ahí porque de otra manera sería redundante. Si usted quería ser redundantes y líneas de salida de residuos, .. 3 more podría estar sustituidos con

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

pero no hay necesidad de salida de estas tres líneas, porque ya están implícitas.