我在同一个控制器中有几个显式捕获相同异常的方法,所以我愿意用Grails异常处理程序替换它们,但我遇到了一个问题:每个控制器中的catch块都会记录一条带有上下文的消息它被称为,像这样:
catch (WhateverException e) {
response.status = HttpStatus.PROPER_HTTP_STATUS
log.info("A whatever error occurred. Context = ${[foo: request.foo, bar: request.baz]}")
}
事实是,即使捕获的异常相同,上下文的内容对于每个控制器操作都是不同的。
有没有办法将上下文作为参数传递给whateverException
异常处理程序,以便从每个操作中删除显式的catch块?
答案 0 :(得分:1)
Grails并不直接允许这样做。
我仍然有一些想法:
PatternLayoutEncoder
因此提供%X
)。甚至可以使用Grails interceptor来填充MDC,其中包含所有请求的公共参数。request
属性。如果要记录的请求属性始终相同,则只有它们的值不同,这将是最简单的解决方案通常,我构建这样的例外:
class MyException extends RuntimeException {
final int field1
final String field2
MyException(int field1, String field2) {
super("a message that includes $field1 and $field2")
this.field1 = field1
this.field2 = field2
}
}
这样,上下文(field1
,field2
)也可以在异常处理程序中访问。