如何停止在日志中截断堆栈轨迹
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(用于Java 7)对发生的事情有非常详细的解释。
当您看到'... 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行“相遇”,然后从上行调用跟踪与包装异常相同。
Apache的Commons Lang提供了一个很好的实用方法ExceptionUtils.printRootCauseStackTrace(),它可以“颠倒”地打印一个嵌套的堆栈跟踪。 结果更直观。
如果您在printStackTrace()方法的原始视图旁看到结果,则会清楚'113 more'行的位置。
我喜欢这里找到的例子:
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 e
function b
。 Function e
抛出一个LowLevelException
导致函数c赶上LowLevelException
和抛出MidLevelException
(包裹LowLevelException
的内部实例MidLevelException
实例。该Exception
类有一个构造,其能够取入一个不同的异常,其包装)。 这导致函数a捕获MidLevelException
并抛出一个HighLevelException
,它现在包装前两个Exception
实例。
正如在其他答案中指出的那样,堆栈跟踪并未真正被截断,您可以看到完整的堆栈跟踪。 在我的例子中.. .3 more
,因为否则它将是多余的。 如果你想成为多余的和浪费的输出线, .. 3 more
可以用.. 3 more
替代
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)
但是没有必要输出这三条线,因为它们已经隐含了。
链接地址: http://www.djcxy.com/p/93141.html