WEB开发网
开发学院软件开发C语言 WF4.0 Beta1之旅(2):异常处理 阅读

WF4.0 Beta1之旅(2):异常处理

 2010-10-01 08:29:24 来源:WEB开发网   
核心提示: trycatch就是我们的逻辑部分,Try中就是我们要执行的程序,WF4.0 Beta1之旅(2):异常处理(2),catches中捕获异常并处理,6.我们先来看下Try中逻辑,有异常的时候为Fault,正常为Closed,我们根据工作流的输入参数UserName来判断其长度其否为偶数,来设置变

WF4.0 Beta1之旅(2):异常处理

trycatch就是我们的逻辑部分。Try中就是我们要执行的程序,catches中捕获异常并处理,

6.我们先来看下Try中逻辑,我们根据工作流的输入参数UserName来判断其长度其否为偶数,来设置变量FirstWord的值,如下:

WF4.0 Beta1之旅(2):异常处理

图片看不清楚?请点击这里查看原图(大图)。

7.在Catches中我们来处理捕获到得异常,这个部分我们可以拖入多个Catch<T>活动,左边为异常类型,右边为相应处理的Action,拖入catch<T>会自动出现如下对话框选择异常类型。如下图:

WF4.0 Beta1之旅(2):异常处理

这个例子中我们捕获异常后的处理方式是将异常再次抛出,我们加入一个Throw活动,并设置其Exception属性。如下图:

WF4.0 Beta1之旅(2):异常处理

8.工作流的部分我们就完成了,下面是宿主程序:

class Program
{
  static voidMain(string[] args)
  {
    AutoResetEvent syncEvent = newAutoResetEvent(false);
    Console.Write("Enter your name: ");
    stringuserName = Console.ReadLine();
    stringgreeting = null;
    Dictionary<string, object> input = newDictionary<string, object>();
    input.Add("UserName", userName);
    WorkflowInstance myInstance;

    if(string.IsNullOrEmpty(userName))
    {
      myInstance = newWorkflowInstance(newSequence1());
    }
    else
    {
      myInstance = newWorkflowInstance(newSequence1(), input);
    }

    myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e)
    {
      if(e.CompletionState == ActivityInstanceState.Closed)
      {
        greeting = e.Outputs["Greeting"].ToString();
      }
      else
      {
        Console.WriteLine("Workflow CompletionState is {0}", e.CompletionState);
        Console.ReadLine();
      }
      syncEvent.Set();
    };

    myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)
    {
      Console.WriteLine(e.UnhandledException.ToString());
      returnUnhandledExceptionAction.Terminate;
    };

    myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)
    {
      Console.WriteLine(e.Reason);
      syncEvent.Set();
    };

    myInstance.Run();
    syncEvent.WaitOne();
    Console.WriteLine(greeting);
    Console.ReadLine();
  }
}

不论工作流是否发生异常都会执行OnCompleted事件,只不过e.CompletionState不同,有异常的时候为Fault,正常为Closed。

工作流也可以使用WorkflowInstance的OnUnhandledException事件来处理在TryCatch中没有处理的异常。

9.单元测试代码如下:

[TestMethod]
public void IfElseHelloWorldTest()
{
   Dictionary<string, object> input = new Dictionary<string, object>();
   {
     { "UserName", "Cary" }
   };
   var output = WorkflowInvoker.Invoke(new CaryWFDemo.Sequence1(), input);
   Assert.AreEqual("Hello,Cary", output["Greeting"]);
}

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ShouldHandleNullUserName()
{
   WorkflowInvoker.Invoke(new CaryWFDemo.Sequence1());
}

系列文章:WF4.0 Beta1之旅(1):基本介绍

上一页  1 2 

Tags:WF 之旅

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接