Grails 事务服务导致ErrorController呈现而不是所需视图
我继承了一个使用错误控制器的grails项目 在Grails 事务服务导致ErrorController呈现而不是所需视图,grails,error-handling,Grails,Error Handling,我继承了一个使用错误控制器的grails项目 在URLMappings中有以下条目: "500"(controller: 'error', action:'error') 特定errorController呈现特定视图: render view:'/error/prodError' 我不明白的是,如何绕过错误控制器处理500个错误,并发送到视图/play/play,但在其他情况下不删除旧错误 即使我从playService捕获异常,我仍然得到/error/proderor,而不是/play
URLMappings
中有以下条目:
"500"(controller: 'error', action:'error')
特定errorController呈现特定视图:
render view:'/error/prodError'
我不明白的是,如何绕过错误控制器处理500个错误,并发送到视图/play/play
,但在其他情况下不删除旧错误
即使我从playService捕获异常,我仍然得到/error/proderor
,而不是/play/play
我调试了代码,发现render
方法被调用了两次。当服务中抛出异常并回滚事务时,将调用一次以转到/play/play
,但调用另一次以转到/error/proderor
请参阅下面的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是因为回滚的结果是意外回滚异常
因此:对于由特定的
控制器
产生的特定类型的异常
,如何不输入错误控制器
?如果您不想在控制器内处理错误,您可以使用以下url映射呈现(或任何其他)视图:
"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')
}
如中所述,您应该避免由于StackOverflowExceptions
而引发错误控制器的大量异常。我认为不可能在同一类型但从不同控制器抛出的两个异常之间进行区分
如果在错误控制器中处理异常,则可以尝试直接设置响应代码。因此,url映射可能无法处理已处理的异常 我该把它放在哪里?这是否适用于所有错误?我更新了我的答案以包含更多信息。这很有趣。什么是多个place throw
UnexpectedRollbackException1?那么我是否需要在
ErrorController`中检查请求
,以找到是谁扔的?例如,如果我想针对某一特定情况采取不同的行动,听起来很有希望!你应该试试看。:-)