在我的 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/

10-10 20:16