贵州网站制作设计公司,公司组网,网页设计策划书方案,网站建设公司客户开发手册备注#xff1a;这篇文章的使用环境是.NET framework 4.0 RC 1 在WF4中创建native活动时#xff0c;NativeActivity是非常强大的。其众多的功能之一是围绕错误处理。 调度子活动的时的基本错误处理。 当NativeActivity执行的时候#xff0c;它是通过一个NativeActivityConte… 备注这篇文章的使用环境是.NET framework 4.0 RC 1 在WF4中创建native活动时NativeActivity是非常强大的。其众多的功能之一是围绕错误处理。 调度子活动的时的基本错误处理。 当NativeActivity执行的时候它是通过一个NativeActivityContext实例这个实例通过使用ScheduleActivity()函数来调度其他活动。ScheduleActivity()函数有几个重载其中一个使用了FaultCallback。当执行被调度的子活动发生一些异常时就会调用FaultCallback。调用错误处理函数需要一组参数这些参数包括NativeActivityFaultContext和未处理的异常。该NativeActivityFaultContext包含一个用于错误处理的HandleFault()函数。考虑到工作流的异步特性最直接的一个try / catch块是行不通。 因此我希望下面活动能捕获任何异常然后继续。 1 public sealed class MyActivity : NativeActivity 2 { 3 public Activity Body { get; set; } 4 protected override void Execute(NativeActivityContext context) 5 { 6 context.ScheduleActivity(Body, FaultHandler); 7 } 8 private void FaultHandler(NativeActivityFaultContext faultContext, Exception propagatedException, ActivityInstance propagatedFrom) 9 {10 Console.WriteLine(propagatedException.Message);11 faultContext.HandleFault(); 12 }13 } 不要使用此代码它有一个严重的错误 让我们通过执行下面的工作流测试一下这段代码 1 private static Activity CreateWorkflow() 2 { 3 return new Sequence 4 { 5 Activities 6 { 7 new WriteLine { Text Start outer sequence. }, 8 new MyActivity 9 { 10 Body new Sequence11 { 12 Activities 13 { 14 new WriteLine { Text Start inner sequence. },15 new Throw 16 {17 Exception new InArgumentException(ctx new DivideByZeroException())18 },19 new WriteLine { Text End inner sequence. } 20 }21 }22 }, 23 new WriteLine { Text End outer sequence. }24 } 25 }; 26 } 对于这个工作流我期待下面这样的输出 但实际情况是别的东西我会收到以下输出 即使异常被上级捕获我们可以看到第二个内部的WriteLine仍然执行了 这种现象让我们想起了臭名昭著VB6 On Error Resume Next 当某语句出现错误时,跳过它,执行下面一行的代码。 这并不是我真正期待和希望的。修复很容易。所需要做的是使用CancelChild()函数明确取消正在执行的子活动。下面是NativeActivity的正确版本。 1 public sealed class MyActivity : NativeActivity 2 { 3 public Activity Body { get; set; } 4 protected override void Execute(NativeActivityContext context) 5 { 6 context.ScheduleActivity(Body, FaultHandler); 7 } 8 private void FaultHandler(NativeActivityFaultContext faultContext, Exception propagatedException, ActivityInstance propagatedFrom) 9 {10 Console.WriteLine(propagatedException.Message);11 faultContext.HandleFault();12 faultContext.CancelChild(propagatedFrom);13 }14 } 本文转自麒麟博客园博客原文链接http://www.cnblogs.com/zhuqil/archive/2010/03/11/error-handling-in-a-nativeactivity.html如需转载请自行联系原作者