我继承了一个使用错误控制器的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
,有人会怎么做?
答案 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映射可能无法处理已处理的异常。