class MyController {
def myAction = {
throw new MyException("Test")
}
}
是否可以捕获/处理上面代码抛出的异常?下面的url-mapping有点工作,但它会导致异常被记录,这很烦人,因为在我的情况下我能够处理它。
"500"(controller: "error", action: 'myExceptionHandler', exception: MyException)
为什么我不包装可能在try / catch中引发异常的代码?好吧,我有几个行为可能会抛出相同的异常。在try / catch中包装它们中的每一个都违反了DRY原则。
答案 0 :(得分:5)
这个令人敬畏的模式怎么样。
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
}
}
答案 1 :(得分:2)
有一种方法可以使用Grails进行常见的异常处理。
首先,在您的UrlMapping文件中,您可以按如下方式声明映射:
"500" (controller: "foo", action: "bar", exception: FooBarException)
但请记住,这会使您的日志文件充满错误消息。根据具体的用例,这可能是您想要的,也可能不是。
如果您不希望产生错误消息,可以使用插件。它应该在将“声明性异常处理+ grails”放入google后弹出。
就个人而言,我使用以下方法:我将所有异常异常路由到ErrorController。在那里,我可以访问请求[“异常”],以及一些其他参数,如原始控制器和操作(我使用之前的过滤器手动将此信息放入请求属性映射)。我决定采取适当的步骤 - 通常在原始控制器上调用一些动作,比如fatalError。
答案 2 :(得分:1)
在Grails中可能有一个更“正确”的方法,但是编写一个接受闭包并在需要时处理异常的方法。然后你的代码就像:
class MyController {
def myAction = {
handleMyException {
throw new MyException("Test")
}
}
}
它引入了一行代码,但异常处理代码至少在一个地方,并且您可以在抛出它的操作中处理异常。