是否可以捕获/处理从Grails控制器抛出的异常?Aop?

是否可以捕获/处理从Grails控制器抛出的异常?Aop?,grails,exception-handling,aop,Grails,Exception Handling,Aop,是否可以捕获/处理上述代码引发的异常?下面的url映射有点工作,但它会导致记录异常,这很烦人,因为在我的例子中,我能够处理它 class MyController { def myAction = { throw new MyException("Test") } } 为什么我不包装可能在try/catch中引发异常的代码?我有几个操作可能会抛出相同的异常。用try/catch包装它们违反了干燥原则 在Grails中可能有一种更“正确”的方法来实现这一点,但是如果需要,

是否可以捕获/处理上述代码引发的异常?下面的url映射有点工作,但它会导致记录异常,这很烦人,因为在我的例子中,我能够处理它

class MyController {
   def myAction = {
      throw new MyException("Test")
   }
}
为什么我不包装可能在try/catch中引发异常的代码?我有几个操作可能会抛出相同的异常。用try/catch包装它们违反了干燥原则

在Grails中可能有一种更“正确”的方法来实现这一点,但是如果需要,可以编写一个接受闭包并处理异常的方法。那么您的代码将类似于:

"500"(controller: "error", action: 'myExceptionHandler', exception: MyException)

它引入了一行代码,但是异常处理代码至少都在一个地方,并且您可以在抛出异常的操作中处理异常。

有一种方法可以使用Grails进行公共异常处理

首先,在UrlMapping文件中,您可以按如下方式声明映射:

class MyController {
   def myAction = {
      handleMyException {
         throw new MyException("Test")
      }
   }
}
但是请记住,这会使日志文件充斥错误消息。根据具体的用例,这可能是您想要的,也可能不是

如果您不想产生错误消息,可以使用插件。它应该在将“声明性异常处理+grails”放入google后弹出


就个人而言,我使用以下方法:将所有异常异常路由到ErrorController。在那里,我可以访问request[“exception”],以及一些额外的参数,如原始控制器和操作(我使用before过滤器手动将这些信息放入request属性映射中)。然后我决定采取适当的措施——通常在原始控制器上调用一些操作,比如fatalError。

这个令人敬畏的模式怎么样


谢谢你的朋友!它并没有达到我想要的程度,但它是为了摆脱try/catch.SystemController来处理异常。。。美丽的!
"500" (controller: "foo", action: "bar", exception: FooBarException)
class UrlMappings {
    static mappings = {
      "/$controller/$action?/$id?" {
          constraints { // apply constraints here  }
      }
    "500"(controller:'system', action:'error')
}

class SystemController {
    def error = {
        // Grails has already set the response status to 500

        // Did the original controller set a exception handler?
        if (request.exceptionHandler) {
            if (request.exceptionHandler.call(request.exception)) {
                return
            }           
            // Otherwise exceptionHandler did not want to handle it
        }       
        render(view:"/error")        
    }
}

class MyAjaxController {

    def beforeInterceptor = {
        request.exceptionHandler = { ex ->
            //Do stuff           
            return true
        }
    }

    def index = {
        assert false
    }
}