Exception 为什么Grails会删除我的异常?

Exception 为什么Grails会删除我的异常?,exception,grails,groovy,error-handling,Exception,Grails,Groovy,Error Handling,如果将其放入控制器操作中: def inner = new RuntimeException("inner") def middle = new Exception("middle", inner) def outer = new IllegalArgumentException("outer", middle) throw outer Grails的错误调试页面(最重要的是日志)将只显示内部异常类及其消息: 错误500:内部服务器错误 URI:/… 类:java.lang.RuntimeEx

如果将其放入控制器操作中:

def inner = new RuntimeException("inner")
def middle = new Exception("middle", inner)
def outer = new IllegalArgumentException("outer", middle)
throw outer
Grails的错误调试页面(最重要的是日志)将只显示内部异常类及其消息:

错误500:内部服务器错误

URI:/…
类:java.lang.RuntimeException
消息:内部

这是有问题的,因为当您选择用更具描述性的消息包装异常时,大多数情况下,外部消息在调试问题时更为重要

实际上,像普通Java一样,在原因链中包含所有异常,包括它们的类名、消息和堆栈跟踪,这将非常有用

我自己也尝试过在错误页面中打印异常,但是剥离是在调用错误视图之前发生的

是否存在可以更改此行为的配置参数

编辑:我已经和了,但到目前为止,我还没有找到一个解决方法,甚至在Grails源代码中也没有出现这种剥离的地方。

试试:

通过将grails.full.stacktrace VM属性设置为“true”,即将-Dgrails.full.stacktrace=true选项添加到应用程序启动脚本中,可以完全禁用stacktrace筛选


我找到了剔除例外的地方

它位于调用以下方法的
org.codehaus.groovy.grails.web.errors.GrailExceptionResolver.resolveException()
中:

protected Exception findWrappedException(Exception e) {
    if ((e instanceof InvokerInvocationException)||(e instanceof GrailsMVCException)) {
        Throwable t = getRootCause(e);
        if (t instanceof Exception) {
            e = (Exception) t;
        }
    }
    return e;
}
这将测试当前异常是InvokerInvocationException还是GrailsMVceException,这是由控制器内的用户代码引发的,然后通过
getRootCause()
丢弃所有外部异常

这显然是一个错误


我还发现原始异常可以在
请求中找到。“javax.servlet.error.exception”

Nope。它使stacktrace更长,但顶部消息仍然是“内部”而不是“外部”。