为什么Grails剥夺了我的异常?

时间:2014-12-19 18:41:56

标签: 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.RuntimeException
  消息:内部

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

实际上,在原因链中包含所有异常,包括类名,消息和堆栈跟踪,就像常规Java一样。

我已尝试在错误页面中自己打印异常,但在调用错误视图之前发生了剥离。

是否有可以改变此行为的配置参数?

编辑:我posted a bugstarted a mailing list thread,但到目前为止,我还没有找到解决方法,甚至也没有找到Grails源代码中发生此剥离的位置。

2 个答案:

答案 0 :(得分:1)

尝试this

  

您可以通过将grails.full.stacktrace VM属性设置为" true"来完全禁用堆栈跟踪过滤。即将-Dgrails.full.stacktrace = true选项添加到应用程序启动脚本中。

答案 1 :(得分:0)

我找到了剥离例外的地方。

它在org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver.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还是GrailsMVCException,这是由控制器内的用户代码引发的情况,然后通过{{抛弃所有外部异常 1}}

这显然是一个错误。

我还发现原始例外可以在getRootCause()

中找到