4

在我的 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')
    }
}

如果“start”状态引发了 MemberException,则执行应该继续到“handleRegMemberException”状态,但事实并非如此。我的流程定义有什么问题,或者我对它应该如何工作的理解有问题吗?

谢谢,唐

4

2 回答 2

0

我对 Groovy 和 Grails 还是很陌生,但我有一个建议。也许这个问题与 Grails 框架(以及 Groovy )处理已检查和未检查异常的方式不同有关。

如果 MemberException 是一个已检查异常(扩展 Exception),则闭包内的“抛出”可能会将执行完全带出 web 流。你和我都可以在这本书上做一些 RTFM……我从这里看到我书架上的 Groovy 书。作为一个快速的回答,我会说将 MemberException 更改为未经检查的异常(扩展 RuntimeException),看看是否得到相同的结果。或者,您可以将 MemberException 包装在 RuntimeException ...

throw new RuntimeException(ex)

于 2009-07-09T00:34:31.127 回答
0

流程应该按照您的预期运行。您的流程可能有问题,例如服务中的其他一些错误,但从您的问题中不清楚实际发生了什么。你说你期望流如何表现,然后你说它的表现不像你预期的那样,但你没有说它实际上是如何表现的。

我建议在您的流程中添加一些跟踪,以查看实际发生的情况。

顺便说一句,在 grails 1.2-M3 中,有一些已知错误与不同版本的 grails 和 webflows 被破坏:http: //jira.codehaus.org/browse/GRAILS-5185

这是我的流程,类似于您编写的流程:

class SomeController {

    def index = {           
        redirect(action:'someProcess')          
        }

def someProcessFlow = {

    start{
        action{
            dosome -> 
                println "-> inside start action closure"
            try{
                println "-> throwing IllegalArgumentException"
                throw new IllegalArgumentException()
            }catch(IllegalArgumentException ex){
                println "-> inside catch"
                throw ex
                }
            throw new Exception()
            "success"               
            }
        on("success").to "helloPage"
        on(IllegalArgumentException).to "illegal"
        on(Exception).to "handleException"
        }

    illegal{
        action{             
            println "-> illegal handled"
            "success"
            }
        on("success").to "helloPage"
        }

    handleException{
        action{             
            println "-> generic exception handled"
            "success"
            }
        on("success").to "helloPage"
    }

    helloPage()

    }
}

它的行为与您预期的一样,输出为:

-> inside start action closure
-> throwing IllegalArgumentException
-> inside catch
2009-11-03 11:55:00,364 [http-8080-1] ERROR builder.ClosureInvokingAction  
- Exception     occured invoking flow action: null
 java.lang.IllegalArgumentException
    at SomeController$_closure2_closure3_closure6.doCall(SomeController:18)
    at java.lang.Thread.run(Thread.java:619)
-> illegal handled
于 2009-11-03T15:07:53.030 回答