zoukankan      html  css  js  c++  java
  • WWF3事务和异常处理类型活动<第四篇>

    一、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)
            {
    
            }
        }

      当天气不同时,输出效果如下:

      

      输出:

      

  • 相关阅读:
    复习题之后缀表达式
    专项训练之枚举
    专项训练之二分
    深夜毒物
    笑面的学校日常(14)最近一次更新2017 04 06
    了不起的竞赛生(7)(最近一次更新2017 04 06)
    水题日常——动态规划 洛谷
    Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
    Cogs 1708. 斐波那契平方和(矩阵乘法)
    Codevs 1482 路线统计(矩阵乘法)
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3956387.html
Copyright © 2011-2022 走看看