2009-07-08 7 views
4

Dans mon application Grails, j'ai défini flux web ce qui suit (simplifié)Grails de gestion des exceptions de flux 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') 
    } 
} 

Si un MemberException est jeté par le « start » état, l'exécution doit procéder à la « handleRegMemberException » état, mais pas. Y a-t-il quelque chose qui ne va pas dans ma définition de flux ou ma compréhension de la façon dont cela devrait fonctionner?

Merci, Don

Répondre

0

Je suis encore assez nouveau pour Groovy et Grails, mais j'ai une suggestion. Peut-être que le problème a quelque chose à voir avec la différence dans la façon dont le framework Grails (et Groovy d'ailleurs) gère les exceptions cochées ou non vérifiées.

Si MemberException est une exception vérifiée (étend Exception), le 'throw' qui se trouve à l'intérieur de la fermeture se comporte peut-être de manière à provoquer l'exécution en dehors du flux Web. Vous et moi pourrions faire du RTFM sur celui-ci ... Je vois le livre Groovy sur ma bibliothèque d'ici. En guise de réponse rapide, je dirais que changeExceptionException à une exception non vérifiée (étend RuntimeException) et voyez si vous obtenez les mêmes résultats. Ou bien, vous pouvez envelopper MemberException dans une RuntimeException ...

throw new RuntimeException(ex)

0

Le flux doit se comporter comme prévu. Quelque chose pourrait ne pas être correct dans votre flux, par exemple une autre erreur dans le service, mais votre question ne montre pas clairement ce qui se passe réellement. Vous dites comment vous vous attendez à ce que le flux se comporte, puis vous dites qu'il ne se comporte pas comme vous le souhaitiez, mais vous ne dites pas comment il se comporte réellement.

Je suggère d'ajouter quelques traces à votre flux pour voir ce qui se passe réellement.

Par ailleurs, il y a quelques bugs connus avec les différentes versions de Grails et webflows sont brisés dans Grails 1.2-M3: http://jira.codehaus.org/browse/GRAILS-5185

Voici mon flux similaire à ce que vous avez programmé:

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() 

    } 
} 

Il se comporte comme prévu et la sortie est:

-> 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 
Questions connexes