【问题标题】:grails web flow exception handlinggrails web flow异常处理
【发布时间】:2010-11-09 02:21:02
【问题描述】:

在我的 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”状态,但事实并非如此。我的流程定义是否有问题,或者我对它应该如何工作的理解有问题?

谢谢, 唐

【问题讨论】:

    标签: grails groovy spring-webflow


    【解决方案1】:

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

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

    throw new RuntimeException(ex)

    【讨论】:

      【解决方案2】:

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

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

      顺便说一句,在 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
      

      【讨论】:

        猜你喜欢
        • 2012-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-11
        相关资源
        最近更新 更多