`

坚持学习WF(24):WF中的异常处理

阅读更多

[置顶]坚持学习WF文章索引

对于C#程序中抛出的异常我们可以使用try-catch来捕获并处理。在WF中的对异常的处理和C#中也比较相似,不过有一些不同,主要有以下几点:

1. WF中一个未处理的异常仅仅会让当前的工作流实例终止而不会导致整个应用程序终止,并且会触发WorkflowRuntime的WorkflowTerminated事件。
2. WF中的异常处理是异步的,所以WF可以将未处理的异常放在内部队列中等待处理。
3. WF中的异常可以使用代码方式处理,也可以在WF模型中处理。我们使用FaultHandlerActivity活动,该活动就像C#中的catch语句一样,每个FaultHandlerActivity活动对应一个异常类型,该活动为复合活动,我们可以添加子活动来编写自己的逻辑处理程序.

如果在一个工作流中发生异常,他会先检查自身有没有捕获异常,如有没有会检查他的父活动有没有捕获,如果直到工作流的根活动都没有捕获异常,那么整个工作流就终止了,这时会引发WorkflowRuntime的WorkflowTerminated事件。

未处理的异常

1.我们下面举例来说明,首先我们建立一个顺序工作流控制台项目CaryExceptionDemo,新建一个顺序型工作流ExWorkflow,我们放两个CodeActivity.在CodeActivity1中我们根据workflow传入的参数抛出两个异常。具体代码如下:

    public sealed partial class ExWorkflow: SequentialWorkflowActivity
    {
        private int number;
        public int Number
        {
            get { return number; }
            set { number = value; }
        }
        public ExWorkflow()
        {
            InitializeComponent();
        }

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
switch (Number) { case 1: throw new DivideByZeroException("DivideByZeroError"); case 2: throw new ArithmeticException("ArithmeticError"); default:break; } } private void codeActivity2_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("第二个CodeActivity执行了"); } } 2.对这两个异常我们不去捕获,他会使工作流终止触发WorkflowRuntime的WorkflowTerminated事件,宿主程序的代码
如下:
class Program
{
   static void Main(string[] args)
   {
      using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
      {
          AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); }; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine("工作流终止:" + e.Exception.Message); waitHandle.Set(); }; Dictionary<String, Object> wfParas = new Dictionary<string, object>(); wfParas.Add("Number", 1); Dictionary<String, Object> wfParas1 = new Dictionary<string, object>(); wfParas1.Add("Number", 2); Console.WriteLine("---开始执行第一个工作流---"); WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CaryExceptionDemo.ExWorkflow), wfParas); instance.Start(); waitHandle.WaitOne(); Console.WriteLine("---第一个工作流执行结束---"); Console.WriteLine();
Console.WriteLine("---开始执行第二个工作流---"); WorkflowInstance instance1 = workflowRuntime.CreateWorkflow(typeof(CaryExceptionDemo.ExWorkflow), wfParas1); instance1.Start(); waitHandle.WaitOne(); Console.WriteLine("---第二个工作流执行结束---"); } }
}
3.执行的结果为在WorkflowTerminated中输出相关信息如下表,我们发现CodeActivity2活动并没有执行,正是由于
CodeActivity1抛出的异常导致工作流终止。

---开始执行第一个工作流---
工作流终止:DivideByZeroError
---第一个工作流执行结束---

---开始执行第二个工作流---
工作流终止:ArithmeticError
---第二个工作流执行结束---
请按任意键继续. . .

 

使用FaultHandlerActivity捕获异常

1.我们下面捕获并处理CodeActivity1抛出的两个异常,我们在工作流的错误处理试图中使用FaultHandlerActivity活动来捕获异常,如下图所示:

wfex1

2.我们在faultHandlersActivity1中拖入两个FaultHandlerActivity活动,将他们的FaultType属性分别设置为System.DivideByZeroException和System.ArithmeticException,这里有一点要注意那就是这两个活动的左右次序不能反了,处理DivideByZeroException一定要在左边,这就像我们C#中的Catch一样先处理特定的异常,在处理一般的异常。在FaultHandlerActivity的中我们放我们自己的处理异常代码,如下:

private void codeWFHandle_ExecuteCode(object sender, EventArgs e)
{
   FaultHandlerActivity faultActivity = ((Activity)sender).Parent as FaultHandlerActivity;
   String message = String.Empty;
   if (faultActivity != null)
   {
       message = faultActivity.Fault.Message;
   }
   Console.WriteLine("处理算术异常: {0}",
   message);
}

运行该工作流得到如下结果:

---开始执行第一个工作流---
处理除0异常: 除0异常
---第一个工作流执行结束---

---开始执行第二个工作流---
处理算术异常: 算术异常
---第二个工作流执行结束---
请按任意键继续. . .

 

在活动中捕获异常

我们从上面的结果中发现工作流中CodeActivity2依然没有执行,这主要是因为当异常发生的时候会自动寻找合适的FaultHandlerActivity来处理,由于我们在工作流级别捕获的异常自然CodeActivity2就没有执行,有点时候这不是我们想要的结果,如何来达到我们的目的呢,其实很简单,我们让CodeActivity1在一个容器中执行,我们使用该容器的错误处理试图来捕获异常并处理,在WF中只有实现的Activity组件,才有FaultHandlersActivity异常捕获容器。SequenceActivity就可以实现,工作流设计如下图:

wfex2

在sequenceActivity1的错误处理视图中我们只需要将原来放在工作流错误处理视图中的两个FaultHandlerActivity剪切过来就可以了。现在我们运行程序得到结果如下:

---开始执行第一个工作流---
处理除0异常: 除0异常
第二个CodeActivity执行了
---第一个工作流执行结束---

---开始执行第二个工作流---
处理算术异常: 算术异常
第二个CodeActivity执行了
---第二个工作流执行结束---
请按任意键继续. . .

从结果中我们可以CodeActivity2活动执行了。这些是WF中关于异常处理的一些知识。

 

分享到:
评论

相关推荐

    坚持学习WF,WF学习教程

    坚持学习WF(1):从HelloWorld开始 ...坚持学习WF(24):WF中的异常处理 坚持学习WF(25):取消容器(CancellationHandlerActivity) 说明了WF如果捕获和处理异常,并介绍了CancellationHandlerActivity活动的基本使用。

    WF教程_坚持学习WF

    坚持学习WF(2):WF创作模式和设计时工具 坚持学习WF(3):WF框架概览 2.3两篇主要全面的阐述了WF框架和Visual Studio对开发WF的一些设计时的工具。 坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty) ...

    坚持学习WF

    坚持学习WF(1):从HelloWorld开始 ... 坚持学习WF(24):WF中的异常处理 坚持学习WF(25):取消容器(CancellationHandlerActivity) 说明了WF如果捕获和处理异常,并介绍了CancellationHandlerActivity活动的基本使用。 .

    坚持学习WF(1):从HelloWorld开始 源码

    在本篇“坚持学习WF(1):从HelloWorld开始”的源码分析中,我们将深入理解WF的基础知识和创建第一个工作流的步骤。 首先,让我们了解WF的基本概念。WF提供了一种模型化业务流程的方式,通过活动(Activities)来表示...

    坚持学习WF(5):自定义活动(CustomActivity) 源码

    总的来说,自定义活动是WF中实现业务逻辑灵活性的关键。通过深入理解和实践自定义活动的创建,开发者可以构建出符合业务需求的高效、可维护的工作流应用程序。通过对`CaryActivity`源码的学习和分析,我们可以更好地...

    WF工作流学习资料

    3. **WF活动**:WF的核心是活动,它们是工作流中的最小执行单元。活动可以是内置的,如If条件判断、Assign赋值,也可以是自定义的,满足特定业务需求。活动可以通过组合和嵌套形成复杂的工作流逻辑。 4. **WF生命...

    wf4cookbook中文

    4. **错误处理和异常**:解释了如何处理工作流执行过程中的错误和异常,以及如何设计健壮的工作流。 5. **持久化和工作流实例管理**:深入讲解了如何保存和恢复工作流实例,以及如何管理长期运行的工作流。 6. **...

    Apress - Beginning WF: Windows Workflow in .NET 4.0 Mar 2010

    - **第6章:异常处理**:提供工作流中的错误处理策略和技术。 - **第7章:扩展内置活动**:介绍如何通过扩展内置活动来增强工作流的功能性。 3. **第3部分:通信** - **第8章:发送与接收**:介绍如何使用工作流...

    WF学习从入门到提高

    活动是WF中最基本的构建块,它们代表了流程中的一个操作或步骤。你可以使用内置的活动,如If、Parallel、SequentialWorkflowActivity等,也可以自定义活动以满足特定需求。在设计工作流时,你会用到这些活动,通过...

    wf工作流资料<转自网上的笔记>

    "坚持学习WF(9)本地服务之事件处理"探讨了WF中的事件处理机制,这是工作流与外部系统交互的关键。这部分可能会讲解EventActivity以及如何使用事件触发工作流的行为。 "坚持学习WF(10)在工作流中使用关联"会涉及工作...

    爱普生WF-7720_WF-7710_WF-7210维修手册 含报错代码解释

    《爱普生WF-7720、WF-7710、WF-7210维修手册:含报错代码解释》 本手册详细介绍了爱普生WF-7720系列、WF-7710系列以及WF-7210系列彩色喷墨打印机的拆机分解、故障代码解析及解决思路。这些打印机支持云打印功能,是...

    Beginning WF Windows Workflow in .NET 4.0

    书中还探讨了在使用WF时应遵循的设计模式和最佳实践,例如如何合理地使用事务、如何处理错误和异常、如何优化性能等。这些指导原则对于构建稳定、高效的工作流系统至关重要。 #### 5. 集成与扩展 WF提供了丰富的...

    (2007 Apress)Pro WF Windows Workflow in .NET3.0.pdf

    - **活动(Activity)**:WF中的基本执行单元,代表了工作流的一部分逻辑。 - **工作流引擎**:负责解释活动并执行工作流的组件。 - **持久化**:WF支持将工作流的状态保存到持久存储中,以便在后续时刻恢复执行。 ##...

    【翻译】WF从入门到精通(第一章):WF简介源代码下载

    活动是WF中最基本的构建块,它可以代表一个业务操作或者是一个更复杂的工作流子流程。工作流是由一系列活动组成的逻辑流程,它们共同定义了一个业务过程。运行时是WF执行工作流的地方,它负责管理工作流的生命周期,...

    《WF本质论》附书源码

    5. **规则引擎**:WF中可以集成规则引擎,使工作流可以根据业务规则进行决策。源码可能包含如何定义和应用规则的示例。 6. **工作流服务**:如果源码包含了服务方面的内容,那么会涉及如何将WF与WCF集成,创建基于...

    WF从入门到精通(源码)

    9. **异常处理与事务**:理解如何在WF中处理错误和异常,以及如何利用WF的事务支持确保流程的一致性。 10. **监控与调试**:学习如何使用Visual Studio和WF提供的工具进行工作流的监控和调试,这对于识别和解决问题...

Global site tag (gtag.js) - Google Analytics