如何阻止堆栈跟踪在日志中截断

时间:2009-01-13 02:12:54

标签: java exception stack-trace

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行)?


Throwable的JavaDocs (for Java 7)对发生的事情有一个非常详细的解释。

6 个答案:

答案 0 :(得分:68)

当你看到'... 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行,然后在向上调用跟踪时与包装异常相同。

答案 1 :(得分:20)

Apache的Commons Lang提供了一个很好的util方法ExceptionUtils.printRootCauseStackTrace(),可以打印嵌套的堆栈跟踪'倒置'。结果更加直观。

如果您在printStackTrace()方法的原始文本旁边看到结果,那么“113多条”行的位置就会很清楚。

答案 2 :(得分:12)

我喜欢找到的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

在源代码中,main调用function a调用调用function b的{​​{1}}调用function eFunction 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)

但是没有必要输出这三行,因为它们已经隐含了。

答案 3 :(得分:0)

我发现这对于获取整个图片很有用。完整了解异常的堆栈跟踪(通常会从主要Exception重复显示行,但会有所帮助)。

        ... 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);
                    }
                }
        }

答案 4 :(得分:-1)

增加-XX:MaxJavaStackTraceDepth JVM选项。

答案 5 :(得分:-2)

在我刚刚描述的博文中how to get more than just "BatchUpdateException: failed batch":设置hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory以禁用hibernate中的批处理。 通常可以使用BatchUpdateException.getNextException来获取失败的原因,但在某些情况下,这可能会返回null。然后完全禁用批处理很有用。