Как остановить усечение stacktraces в журналах



много раз в журналах Java я получу что-то вроде:



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


кто-нибудь знает, как получить полный показ stacktrace (т. е. показать другие 113 строк)?





на JavaDocs (для Java 7) для Throwable есть довольно подробное объяснение того, что происходит.

625   5  

5 ответов:

когда вы видите '...113 more', это означает, что оставшиеся строки исключения "вызвано" идентичны оставшимся строкам с этого момента родительского исключения.

например, у вас будет

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

две трассировки стека "встречаются" в AbstractBatcher.executeBatch, строка 242, а затем с этого момента трассировка восходящего вызова совпадает с исключением обертывания.

Апача Commons Lang обеспечивает хороший метод util ExceptionUtils.printRootCauseStackTrace () который печатает вложенный stacktrace "вверх ногами". Результат гораздо более интуитивный.

Если вы видите результат рядом с оригиналом из метода printStackTrace (), будет ясно, куда пошли "еще 113" строк.

мне нравится найденный пример здесь:

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

в основном, в исходном коде main звонки function a которых звонки function b которых звонки ... который зовет function e. Function e бросает a LowLevelException который вызывает функцию c, чтобы поймать LowLevelException и бросить MidLevelException (обернув LowLevelException экземпляр внутри MidLevelException экземпляра. Элемент Exception класс имеет конструктор, который способен принимать в другом исключении, обернув его). Это вызывает функцию, чтобы поймать элемент MidLevelException и бросить HighLevelException который теперь обертывает предыдущие два Exception экземпляров.

как отмечалось в других ответах, трассировка стека на самом деле не усечена, вы видите полную трассировку стека. Элемент .. .3 more в моем примере есть, потому что это было бы излишним в противном случае. Если вы хотите быть избыточными и тратить выходные линии,.. 3 more можно заменить на

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

но нет необходимости выводить эти три строки, потому что они уже есть подразумеваемый.

увеличить -XX:MaxJavaStackTraceDepth опция JVM.

в блоге я только что описал как получить больше, чем просто "BatchUpdateException: failed batch": set hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory для отключения дозирования в спящем режиме. Обычно можно использовать BatchUpdateException.getNextException чтобы получить причину сбоя, но в некоторых случаях это может вернуть null. Тогда полезно полностью отключить пакетирование.

Comments

    Ничего не найдено.