2009-01-13 41 views
66

很多次了,我会得到这样的:如何停止踪迹在日志截断在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 (for Java 7)为Throwable的有什么事情的一个非常详细的解释。

回答

66

当您看到'... 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,然后从此向上呼叫跟踪相同包装例外。

+0

什么?原因与包装异常相同?我没有得到它......该couse应该显示问题的来源,截断堆栈跟踪时没有显示的内容。我有这个问题,并希望了解这个答案,如果有人可以重新表达它......谢谢!顺便说一句,这个答案似乎并不显示如何打印完整的堆栈跟踪。 – 2010-06-01 18:55:22

+20

@TomBrito你正在看到完整的堆栈跟踪 - 你有两个例外,一个在另一个里面。如果内部(包装)异常的堆栈跟踪是ABCDEFG,并且外部异常的堆栈跟踪是ABCZ,那么您将看到带有栈跟踪“GFEDC ...”的InnerException带来的堆栈跟踪ZCBA的OuterException。然后2个''。这两个是外部堆栈跟踪中的A和B,为了简洁起见,它们被省略。 – Cowan 2010-06-01 23:14:27

19

Apache的Commons Lang提供了一个很好的实用方法ExceptionUtils.printRootCauseStackTrace(),它打印了一个嵌套堆栈跟踪'颠倒'。结果更直观。

如果您在printStackTrace()方法的原始旁边看到结果,则会清楚'113 more'行的位置。

-2

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

10

我喜欢的例子发现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它调用...它调用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) 

被取代,但也没有必要输出这三条线,因为它们已经暗示。