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

Сколько раз в 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 имеют довольно подробное объяснение того, что происходит.

Ответ 1

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

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

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, а затем с последующим трассированием вверх - это то же самое, что и исключение оболочки.

Ответ 2

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

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

Ответ 3

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

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 имеет конструктор, способный взятия в другом исключении, обертывание его). Это вызывает функцию a, чтобы поймать 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)

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

Ответ 4

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