Часто в журналах 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
Кто-нибудь знает, как показать полную трассировку стека (т.е. показать другие 113 строк)?
В JavaDocs (для Java 7) для Throwable есть довольно подробное объяснение того, что происходит.




Когда вы видите «... еще 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, и с этого момента восходящая трассировка вызова такая же, как исключение упаковки.
@TomBrito вы видите полную трассировку стека - у вас есть два исключения, одно внутри другого. Если трассировка стека внутреннего (обернутого) исключения - это ABCDEFG, а трассировка стека внешнего исключения - это ABCZ, тогда вы увидите OuterException с трассировкой стека ZCBA, "вызванное" InnerException с трассировкой стека "GFEDC ... ' потом еще 2 '". Еще 2 - это A и B из внешней трассировки стека, и они для краткости опущены.
Это неверный ответ. Я абсолютно сталкивался с ситуациями, когда оставшиеся строки НЕ идентичны. В этой ситуации решением было увеличить максимальную глубину трассировки стека, как указывает Никита Кокшаров ниже, с помощью параметра виртуальной машины -XX: MaxJavaStackTraceDepth.
Apache Commons Lang предоставляет хороший служебный метод ExceptionUtils.printRootCauseStackTrace (), который печатает вложенную трассировку стека «вверх ногами». Результат намного более интуитивный.
Если вы увидите результат рядом с исходным результатом метода printStackTrace (), будет ясно, куда делись «еще 113» строк.
В сообщении в блоге я только что описал как получить больше, чем просто «BatchUpdateException: неудавшаяся партия»: установить hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory для отключения пакетной обработки в спящем режиме.
Обычно можно использовать BatchUpdateException.getNextException, чтобы выяснить причину сбоя, но в некоторых случаях это может вернуть null. Тогда полезно полностью отключить пакетирование.
Это не отвечает на вопрос. Это может решить его ситуацию в реальной жизни, поэтому добавление его в качестве комментария к его вопросу может быть более полезным, чем публикация ответа.
Мне нравится найденный пример здесь:
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 генерирует 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)
Но эти три строчки выводить не нужно, потому что они уже подразумеваются.
Увеличьте опцию -XX:MaxJavaStackTraceDepth JVM.
Почему за это отказывают? Это и есть ответ. Установите -1 для неограниченной глубины.
Я нашел это полезным, чтобы получить полную картину. Получите полную трассировку стека исключения а также причины (который часто показывает повторяющиеся строки из основного исключения, но может быть полезным).
... catch( Exception e) ...
... catch( NoClassDefFoundError e)
{
for(StackTraceElement ste: e.getStackTrace())
{
System.out.println(ste);
}
if ( e.getCause()!=null )
{
for(StackTraceElement ste: e.getCause().getStackTrace())
{
System.out.println(ste);
}
}
}
Какие? Причина такая же, как и исключение упаковки? Я не понял ... Couse должен показать строку, в которой проблема, что она не показывает при усечении трассировки стека. У меня возникла эта проблема, и я хотел бы понять этот ответ, если бы кто-то мог его переформулировать ... Спасибо! Кстати, этот ответ, похоже, не показывает, как распечатать полную трассировку стека.