找回密码
 立即注册
首页 业界区 业界 WF4.0 Beta1之旅(2):异常处理

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

嗳歉楞 2025-5-29 20:31:37
1.WF3.5中主要使用FaultHandlerActivity来模拟TryCatch捕获异常,现在从WF4.0 beta1来看工具箱中已经没有了FaultHandlerActivity活动,顺序工作流也没有了错误处理视图,取而代之出现了Try/Catch,Catch,Thorw活动,本文就介绍下这几个活动。关于WF3.5中对异常的处理方式,可以参考下文:http://www.cnblogs.com/carysun/archive/2008/10/18/WFException.html
2.我们依然使用顺序工作流模板,我们完成这样一个工作流,工作流的输入参数为UserName,输出参数为Greeting,工作流中会根据输入参数的不同而输出不同的信息,我们要处理的异常就是如果工作流没有提供输入的情况下。
3.工作流的参数如下:
UserName输入参数,Greeting输出参数,如下。
1.jpeg

4.给做工作增加一个变量FirstWord.注意变量是有作用域的,即他的Scope属性。
2.jpeg

5.下面我们看整个工作流的逻辑,工作流上面是try catch,下面是Assign,Assign将Greeting的值设置为FirstWord+“,”+UserName,如下图:
3.jpeg

trycatch就是我们的逻辑部分。Try中就是我们要执行的程序,catches中捕获异常并处理,
6.我们先来看下Try中逻辑,我们根据工作流的输入参数UserName来判断其长度其否为偶数,来设置变量FirstWord的值,如下:
4.jpeg

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

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

8.工作流的部分我们就完成了,下面是宿主程序:
  1. class Program
  2. {
  3.     static voidMain(string[] args)
  4.     {
  5.         AutoResetEvent syncEvent = newAutoResetEvent(false);
  6.         Console.Write("Enter your name: ");
  7.         stringuserName = Console.ReadLine();
  8.         stringgreeting = null;
  9.         Dictionary<string, object> input = newDictionary<string, object>();
  10.         input.Add("UserName", userName);
  11.         WorkflowInstance myInstance;<br>
  12.         if(string.IsNullOrEmpty(userName))
  13.         {
  14.             myInstance = newWorkflowInstance(newSequence1());
  15.         }
  16.         else
  17.        {<br>            myInstance = newWorkflowInstance(newSequence1(), input);
  18.         }<br>
  19.         myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e)
  20.         {
  21.             if(e.CompletionState == ActivityInstanceState.Closed)
  22.             {
  23.                 greeting = e.Outputs["Greeting"].ToString();
  24.             }
  25.             else
  26.            {
  27.                 Console.WriteLine("Workflow CompletionState is {0}", e.CompletionState);
  28.                 Console.ReadLine();
  29.             }
  30.             syncEvent.Set();
  31.         };
  32.         myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)
  33.         {
  34.             Console.WriteLine(e.UnhandledException.ToString());
  35.             returnUnhandledExceptionAction.Terminate;
  36.         };
  37.         myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)<br>        {
  38.             Console.WriteLine(e.Reason);
  39.             syncEvent.Set();
  40.         };
  41.         myInstance.Run();
  42.         syncEvent.WaitOne();
  43.         Console.WriteLine(greeting);
  44.         Console.ReadLine();
  45.     }
  46. }
复制代码
不论工作流是否发生异常都会执行OnCompleted事件,只不过e.CompletionState不同,有异常的时候为Fault,正常为Closed。
工作流也可以使用WorkflowInstance的OnUnhandledException事件来处理在TryCatch中没有处理的异常。
9.单元测试代码如下:
  1. [TestMethod]
  2. public void IfElseHelloWorldTest()
  3. {
  4.      Dictionary<string, object> input = new Dictionary<string, object>();
  5.      {
  6.          { "UserName", "Cary" }
  7.      };
  8.      var output = WorkflowInvoker.Invoke(new CaryWFDemo.Sequence1(), input);
  9.      Assert.AreEqual("Hello,Cary", output["Greeting"]);
  10. }
  11. [TestMethod]
  12. [ExpectedException(typeof(ArgumentNullException))]
  13. public void ShouldHandleNullUserName()
  14. {
  15.      WorkflowInvoker.Invoke(new CaryWFDemo.Sequence1());
  16. }
复制代码
  1.  
复制代码
相关文章:
WF4.0 Beta1之旅(1):基本介绍
    出处:http://carysun.cnblogs.com/    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册