如何打印Groovy堆栈跟踪?

dro*_*del 19 groovy

如何打印Groovy堆栈跟踪?Java方法Thread.currentThread().getStackTrace()产生一个巨大的堆栈跟踪,包括很多Groovy内部.我看到一个从StreamingMarkupBuilder中调用两次的函数看起来应该只调用一次,我想看看为什么Groovy认为应该调用它两次.

amc*_*ack 17

Google搜索会返回以下信息:

显然,有一种org.codehaus.groovy.runtime.StackTraceUtils叫做方法printSanitizedStackTrace.没有该方法多文档,虽然有一个叫方法sanitize被描述为

从异常实例中删除所有明显的groovy-internal跟踪条目.这会修改原始实例并返回它,它不会克隆

所以我会尝试org.codehaus.groovy.runtime.StackTraceUtils.printSanitizedStackTrace(Throwable t)(它是静态的),看看它是否适合你.

  • 最终解决方案:org.codehaus.groovy.runtime.StackTraceUtils.sanitize(new Exception()).printStackTrace().由于某种原因,printSanitizedStackTrace()不起作用. (11认同)
  • 这对我有用: ```org.codehaus.groovy.runtime.StackTraceUtils.sanitize(new Exception(e)).printStackTrace()``` 其中 ```e``` 是捕获的异常 (3认同)
  • 可能是因为您期望 System.out 中的输出,而 printSanitizedStackTrace() 将其发送到 System.err,所以 printSanitizedStackTrace() 的行为与您预期的不一样。我尝试在 Throwable 对象之后添加一个从 add System.out 构造的 PrintWriter 作为第二个参数,但仍然没有得到我期望的输出。 (2认同)

Sho*_*orn 5

我在搜索时发现了这个问题"spock print full stack trace"

我的单元测试是用 Groovy 编写的,使用 Spock 测试框架,并且它们在 Gradle 构建的上下文中运行。

对我来说,修复就像添加exceptionFormat = 'full'到我的 Gradle 测试任务规范一样简单:

test {
  testLogging {
    exceptionFormat = 'full'
  }
}
Run Code Online (Sandbox Code Playgroud)