《WF编程》系列之21 - 故障 Faults
3 min read

《WF编程》系列之21 - 故障 Faults

3.3 故障 Faults

和所有软件一样,工作流未必总是能够完美的执行.例如,数据库服务器的故障就可能使工作流抛出异常.此外,我们还可以通过TrowActivity来人为的抛出一个异常.

在工作流内部管理异常和管理C#中的异常类似.复合活动包含一个故障处理程序(fault handlers)来捕捉异常. 在.NET中,异常一直向上传递直到.NET Runtime为其找到合适的异常处理程序.在工作流内部也是一样,如果活动没有处理发生的异常,Runtime会把这个异常传递给它的父活动.如果Runtime无法找到故障处理程序,Runtime会终止工作流并触发WorkflowTerminated事件.

FaultHandlerActivity在Windows Workflow中用来处理异常.我们可以通过右键单击活动并选择View Faults来查看复合活动的故障处理程序.顺序工作流的设计器底部有三个小图标,其中第三个小图标便是View Faultss的快捷方式.下面是工作流的故障视图:

在故障视图中,我们可以拖放一些FaultHandlerActivity.我们可以将每一个FaultHandlerActivity都和一个.NET异常类型(如System.NullReferenceException或System.ArgumentException)做关联.就像C#中的catch字句,故障处理程序将处理任何给定类型或从给定类型衍生出来的异常.在下面的截图中,我们添加一个故障处理程序并将其FaultType设置为System.Exception.每一个异常的最终父类都是System.Exception,这个故障处理程序将处理工作流中任何可能的异常.

每个故障处理程序都有一个子活动列表,当它捕捉到异常时就去执行这个列表中的活动.就像各种编程语言中的异常处理程序一样,故障处理程序的目的是清空或者逆转还没有完成的工作.如果SequentialWorkflowActivity的故障处理程序处理了异常,工作流Runtime便会触发WorkflowCompleted事件,反之则触发WorkflowTerminated事件.如果我们想要终止工作流,我们可以在故障处理程序中使用ThrowActivity.

在下面的截图中,我们对故障处理程序的配置如下:

l 故障处理程序指定FaultType为System.Exception. 这个活动将传入的异常绑定到一个叫做_fault的域.

l 第一个子活动是一个CodeActivity,会在控制台中输出异常的信息.

l 第二个子活动是ThrowActivity,将其Fault属性绑定到_fault域,它会再次抛出这个异常.