一、FaultHandler
添加一个工作流图如下:
首先添加一个Seruence,在里面添加3个Code,外面添加一个Code,打开Seruence错误处理,在容器里添加一个faultHandler,在faultHandler里添加一个Code活动。
设置faultHandler的FaultType属性如下
注意要绑定属性。
运行效果:
注意到,如果FaultHandler捕捉了错误,那么Seruence内的其他Code活动都不会再执行,但是Seruence外部的Code会继续执行。
二、Throw
在WWF工作流中也可以通过Throw活动来抛出一个特定信息的异常。与C#的throw类似。用户可以通过Throw活动在工作流中声明一个显性的异常并将它抛出,当异常发生时将会触发工作流运行时容器Runtime的"WorkflowTerminated"事件。
新建一个工作流如下:
设置Throw活动的FaultType属性如下:
代码如下:
public sealed partial class Workflow1 : SequentialWorkflowActivity { public Workflow1() { InitializeComponent(); } private void Code1(object sender, EventArgs e) { Console.WriteLine("Code1执行..."); Console.ReadKey(); } private void Code2(object sender, EventArgs e) { Console.WriteLine("捕捉到\"尝试除以0\"异常"); } }
输出如下:
如果Sequence容器不捕捉异常,则容易后面的CodeActicity1活动将不被执行。
三、Compensate
在现实工作中,工作流还需要对某些特殊情况下的业务逻辑进行处理,例如,邮件发错了并不是登录客户的邮箱把它删除,而是再发一封告诉用户你发错了。
在WWF中,可以使用CompensatableSequence活动和Compensatable活动来实现。
像FaultHandler活动一样,补偿也需要指定一个区域,在该区域内如果发生了某些异常情况,那么就可以通过Compensatable来指定该类型的异常应该执行哪个区域内的补偿措施,这个区域可以使用CompensatableSequence活动来限定。CompensatableSequence活动是一个顺序类型的容易,与Sequence活动类似。
范例:模式用户向购买一件商品,有快递发送,在运输过程中可能出现天气原因导致送货延迟,那么将启动补偿的流程来通知买家。
首先定义一个异常,然后新建一个流程如下:
一个Code,一个CompensatableSequence(切换至"查看补偿程序"里面放一个Code,默认视图什么活动都没),一个ifElse(左边一个Code,右边一个Throw(FaultType异常定义为刚刚定义的异常),却换至"查看错误处理"里FaultHandler然后里面一个Compensate)。
切换视图后,工作流显示如下:
Throw不需要捕捉设置faultType。
代码如下:
public sealed partial class Workflow1 : SequentialWorkflowActivity { string str = "吹台风"; MyException exec; public Workflow1() { InitializeComponent(); } private void ReceiveOrderCode(object sender, EventArgs e) { exec = new MyException(str); Console.WriteLine("你的订单已收到..."); } private void SendOnTimeCode(object sender, EventArgs e) { Console.WriteLine("商品准时送达..."); } private void Condition(object sender, ConditionalEventArgs e) { e.Result = str == "天气良好"; } private void Code1(object sender, EventArgs e) { Console.WriteLine("继续..."); Console.ReadKey(); } private void Code2(object sender, EventArgs e) { Console.WriteLine("由于天气原因,货品将延迟送达..."); Console.ReadKey(); } } [SerializableAttribute()] public class MyException : Exception { public MyException(string message) : base(message) { } }
当天气不同时,输出效果如下:
输出:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现