grails web flow异常处理

时间:2009-07-08 15:57:10

标签: grails groovy spring-webflow

在我的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”状态,但不会。我的流程定义有什么问题,或者我对这应该如何工作有所了解?

谢谢, 唐

2 个答案:

答案 0 :(得分:0)

我仍然是Groovy和Grails的新手,但我有一个建议。也许这个问题与Grails框架(以及Groovy)处理已检查和未检查异常的方式有所不同。

如果MemberException是一个已检查的异常(扩展Exception),那么闭包内的'throw'可能会使执行完全退出Webflow。你和我都可以在这个上做一些RTFM ...我从这里看到书架上的Groovy书。作为一个快速回答,我会说将MemberException更改为未经检查的异常(扩展RuntimeException)并查看是否得到相同的结果。或者,您可以在RuntimeException ...

中包装MemberException

throw new RuntimeException(ex)

答案 1 :(得分:0)

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

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

顺便说一句,有一些已知的错误,不同版本的grails和webflows在grails 1.2-M3中被破坏: 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