如果你把它放在控制器动作中:
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 bug和started a mailing list thread,但到目前为止,我还没有找到解决方法,甚至也没有找到Grails源代码中发生此剥离的位置。
答案 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()