2010-08-24 6 views
0

J'utilise un NativeActivity avec une activité enfant appelé corps et un ActivityAction appelé OnFault, voici mon code:Excpetion Manipulation avec un NativeAcitivity

[Designer(typeof(RetryDesigner))] 
public sealed class Retry : NativeActivity { 

    public Activity Body { get; set; } 
    public ActivityAction<Exception> OnFault { get; set; } 

    protected override void CacheMetadata(NativeActivityMetadata metadata) { 
     metadata.AddChild(Body); 
     metadata.AddDelegate(OnFault); 
     base.CacheMetadata(metadata); 
    } 

    protected override void Execute(NativeActivityContext context) { 
     context.ScheduleActivity(Body, OnBodyCompleted, OnBodyFaulted); 
    } 

    void OnFaultCompleted(NativeActivityContext context, ActivityInstance instance) { 
     context.ScheduleActivity(Body); 
    } 

    void OnBodyCompleted(NativeActivityContext context, ActivityInstance instance) { 
    } 

    void OnBodyFaulted(NativeActivityFaultContext faultContext, Exception propagatedException, ActivityInstance propagatedFrom) { 
     faultContext.HandleFault(); 

     if (OnFault != null) { 
      faultContext.ScheduleAction<Exception>(OnFault, propagatedException, OnFaultCompleted); 
     } 
    } 
} 

et mes principaux ressemble à ceci:

static void Main(string[] args) { 

     Variable<Exception> ex = new Variable<Exception>(); 
     DelegateInArgument<Exception> exception = new DelegateInArgument<Exception>(); 

     Retry retry = new Retry { 
      Body = new Sequence { 
       Variables = { ex }, 
       Activities = { 
        new Assign<Exception> { 
         To = new OutArgument<Exception>(ex), 
         Value = new InArgument<Exception>((env) => new Exception("test")) 
        }, 
        new Throw { 
         Exception = ex 
        } 
       } 
      }, 
      OnFault = new ActivityAction<Exception> { 
       Argument = exception, 
       Handler = new Sequence { 
        Activities = { 
         new WriteLine{ 
          Text = new InArgument<string>(env => 
          exception.Get(env).Message) 
         } 
        } 
       } 
      } 
     }; 

     var workflow = new WorkflowInvoker(retry); 
     workflow.Invoke(); 

     Console.WriteLine(); 
    } 

Le problème est que l'exception ne s'arrête pas dans le rappel OnBodyFaulted et apparaît sur le principal comme une expulsion non couverte.

Comment puis-je arrêter l'exception dans le rappel OnBodyFault, y a-t-il un état ou une propriété dans le workflow pour le faire?

Répondre

1

Le problème est que dans le OnFaultCompleted() vous appelez context.ScheduleActivity (Body) à nouveau. Cette fois-ci sans gestionnaire d'erreurs, ce qui entraîne la même erreur et le workflow complet.