事务服务导致ErrorController呈现而不是所需的视图

时间:2014-10-26 23:06:58

标签: grails error-handling

我继承了一个使用错误控制器的grails项目。

URLMappings内有以下条目:

"500"(controller: 'error', action:'error')

特定的errorController呈现特定视图:

 render view:'/error/prodError'

我不明白的是如何绕过错误控制器获取500个错误并发送到查看/play/play ,但不删除旧版本用于其他情况

即使我从playService中捕获异常,我仍然得到/error/prodError而不是/play/play

我调试了代码,发现render方法被调用了两次。在服务中抛出异常并回滚事务时,它被调用一次到/play/play但是/error/prodError的另一次。

请参阅下面的playController摘录:

PlayController

try{
playService.play(parame:params} //Runtime exception thrown from playService. 
//play is transactional
    }
    catch(Throwable t){
    //Why isn't /play/play rendered? 
//How do I pass errors to playservice for alert rendering?
    render view: '/play/play',
                            model: [
                                domain: domain,
                                customer: customer,
                                game: game]
                        return
            }

更新

具体来说,输入errorController是因为回滚的结果是UnexpectedRollbackException

所以:如果某个特定ErrorController的{​​{1}}特定类型的Exception输入Controller,有人会怎么做?

1 个答案:

答案 0 :(得分:1)

如果您不想在控制器中处理错误,可以使用以下网址映射渲染您的(或任何其他)视图:

"500"(view:'/play/play')

如果你需要处理个别例外,你可以这样做:

static mappings = {
    .
    .
    .
    "500"(controller: "error", action: "unexpectedRollback", exception: UnexpectedRollbackException)
    "500"(controller: "errors", action: "nullPointer", exception: NullPointerException)
    .
    .
    "500"(controller: 'error', action:'error')
}

docs中所述,您应该避免因StackOverflowExceptions而导致错误控制器抛出异常。我认为不可能在两个相同类型的异常之间划分,但是从不同的控制器抛出。

如果您在错误控制器中处理异常,可以尝试直接设置响应代码。所以 - url映射可能无法处理已处理的异常。