Как остановить усечение 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 есть довольно подробное объяснение того, что происходит.
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бросает aLowLevelExceptionкоторый вызывает функцию 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)но нет необходимости выводить эти три строки, потому что они уже есть подразумеваемый.
в блоге я только что описал как получить больше, чем просто "BatchUpdateException: failed batch": set
hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactoryдля отключения дозирования в спящем режиме. Обычно можно использоватьBatchUpdateException.getNextExceptionчтобы получить причину сбоя, но в некоторых случаях это может вернутьnull. Тогда полезно полностью отключить пакетирование.
Comments