Java 如何停止日志中的堆栈跟踪截断
很多时候,在Java日志中,我会得到如下结果:Java 如何停止日志中的堆栈跟踪截断,java,exception,stack-trace,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
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行)
for Throwable对正在发生的事情有一个非常详细的解释。当您看到“…113 more”时,这意味着“caused by”异常的剩余行与父异常上该点的剩余行相同 例如,您将拥有
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>.
com.something.XyzException
在
在
位于org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
在
原因:。
两个堆栈跟踪在AbstractBatcher.executeBatch第242行“相遇”,然后从那时起,向上调用跟踪与包装异常相同。Apache提供了一个很好的util方法,它“颠倒”打印嵌套的堆栈跟踪。结果更加直观
如果您在printStackTrace()方法的原始输出旁边看到结果,那么“113多行”的位置就很清楚了。在我刚才描述的一篇博文中:设置
hibernate.jdbc.factory\u class=org.hibernate.jdbc.NonBatchingBatcherFactory
以禁用hibernate中的批处理。
通常可以使用BatchUpdateException.getNextException
来获取失败的原因,但在某些情况下,这可能返回null
。然后,完全禁用批处理非常有用。我喜欢下面的示例:
基本上在源代码中,main
调用函数a
哪个调用函数b
哪个调用。。。它调用函数e。
函数e
抛出一个低级别异常
,这导致函数c捕获低级别异常
并抛出一个中级别异常
(将LowLevelException
实例包装在MidLevelException
实例中。Exception
类有一个构造函数,可以接收不同的异常,并将其包装)。这会导致函数a捕获中间级别异常
并抛出一个高级异常
,该异常现在封装了前两个异常
实例
正如在其他答案中所指出的,堆栈跟踪并没有真正被截断,您看到的是完整的堆栈跟踪。在我的示例中,…3个以上的
,因为它是多余的,否则它将是多余的。如果您想成为多余的并浪费输出行,。3个以上的
可以用
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)
但是没有必要输出这三行,因为它们已经被暗示了。增加
-XX:MaxJavaStackTraceDepth
JVM选项。我发现这对了解整个情况很有用。获取异常的完整堆栈跟踪和原因(通常显示主异常中的重复行,但可能会有所帮助)
什么?原因与包装异常相同?我没有得到它…couse应该显示问题所在的行,在截断stacktrace时没有显示什么。我有这个问题,希望理解这个答案,如果有人可以重新编写它…谢谢!顺便说一句,这个答案似乎没有显示如何打印e full stacktrace。@TomBrito您看到的是完整的stacktrace——您有两个异常,一个在另一个内部。如果内部(包装)异常的堆栈跟踪是一个B C D e F G,而外部异常的堆栈跟踪是一个B C Z,那么您将看到带有堆栈跟踪Z C B A的OuterException,这是由“InnerException with the stack trace”引起的“G F E D C…‘然后再加两个’"。另外两个是A和B,来自外部堆栈跟踪,它们是为了简洁而指定的。这个答案是不正确的。我绝对遇到过剩余行不相同的情况。在这种情况下,解决方案是增加堆栈跟踪的最大深度,正如Nikita Koksharov在下面指出的,通过使用-XX:MaxJavaStackTraceDepth VM选项。这不会回答问题。这可能会解决他在现实生活中的情况,因此将其添加为对他的问题的评论可能比发布答案更有帮助。为什么这会被否决?这正是答案。设置为-1可获得无限深度。
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)
... 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);
}
}
}