将参数传递给Grails异常处理程序

时间:2018-01-23 09:53:28

标签: grails exception-handling

我在同一个控制器中有几个显式捕获相同异常的方法,所以我愿意用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块?

1 个答案:

答案 0 :(得分:1)

Grails并不直接允许这样做。

我仍然有一些想法:

  1. 使用SLF4J Message Diagnostic Context (MDC) 。在控制器方法中填充引发异常的内容。确保MDC包含在logback编码器中(例如,PatternLayoutEncoder因此提供%X)。甚至可以使用Grails interceptor来填充MDC,其中包含所有请求的公共参数。
  2. 您也可以在Grails异常处理程序方法中访问request属性。如果要记录的请求属性始终相同,则只有它们的值不同,这将是最简单的解决方案
  3. 如果您的Grails控制器是prototype-scoped,您可以将上下文分配给控制器字段,并在异常处理程序中访问它。可能不是最好的解决方案。
  4. 考虑您的例外是否无法捕获上下文'并将其存储在自己的一个字段中
  5. 通常,我构建这样的例外:

    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
        }
    }
    

    这样,上下文(field1field2)也可以在异常处理程序中访问。

相关问题