Обработка исключений с помощью NativeAcctivity - PullRequest
0 голосов
/ 24 августа 2010

Я использую NativeActivity с дочерним действием под названием Body и ActivityAction с именем OnFault, это мой код:

[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);
        }
    }
}

, а мой основной выглядит так:

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

Проблема в том, что исключение не останавливается в обратном вызове OnBodyFaults и появляется на главном в качестве неочищенного исключения.

Как я могу остановить исключение внутри обратного вызова OnBodyFault, есть ли какое-либо состояние или свойстворабочий процесс для этого?

1 Ответ

1 голос
/ 25 августа 2010

Проблема в том, что в OnFaultCompleted () вы вызываете context.ScheduleActivity (Body) снова. На этот раз без обработчика ошибок, что приводит к повторному возникновению той же ошибки и к отказу всего рабочего процесса.

...