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