在我的 Grails 应用程序中,我定义了以下(简化的)Web 流程
def registerFlow = {
start {
action {RegistrationCommand cmd ->
try {
memberService.validateRegistrationCommandDTO(cmd)
} catch (MemberException ex) {
flow.regErrorCode = ex.errorCode
throw ex
}
}
on("success").to "survey" // The 'survey' state has been omitted
on(MemberException).to "handleRegMemberException"
on(Exception).to "handleUnexpectedException"
}
handleRegMemberException {
action {
// Implementation omitted
}
}
handleUnexpectedException {
redirect(controller:'error', action:'serverError')
}
}
如果“开始”状态抛出 MemberException,则执行应继续进入“handleRegMemberException”状态,但它没有。我的流程定义或我对它应该如何工作的理解有问题吗?
谢谢,
大学教师
最佳答案
我对 Groovy 和 Grails 还是很陌生,但我有一个建议。也许这个问题与 Grails 框架(以及 Groovy 就此而言)处理已检查和未检查异常的方式不同有关。
如果 MemberException 是一个已检查的异常(扩展 Exception),那么闭包内部的“throw”可能会使执行完全脱离 webflow。你和我都可以在这个上做一些 RTFM... 我从这里看到了我书架上的 Groovy 书。作为快速回答,我会说将 MemberException 更改为未经检查的异常(扩展 RuntimeException)并查看是否得到相同的结果。或者,您可以将 MemberException 包装在 RuntimeException 中...throw new RuntimeException(ex)
关于grails 网络流异常处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1098991/