[workflow foundation]TryCatch

[workflow foundation]TryCatch

延續上一篇繼續實作

1. 修改物件檔內容新增物件EmployeeDataErrorException


using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloWordWF
{
    /// <summary>
    /// 員工資料
    /// </summary>
    public class EmployeeDataItem
    {        
        public string EmpName { get; set; }
        public string EmpId { get; set; }
        public decimal Salary { get; set; }
    }
    /// <summary>
    /// 公司資料
    /// </summary>
    public class EmployeeData
    {
        public EmployeeData()
        {
            items = new List<EmployeeDataItem>();
        }
        public int CompanyID { get; set; }      
        //引用員工資料類別
        public List<EmployeeDataItem> items { get; set; }
    }
    /// <summary>
    ///  自定義的例外
    /// </summary>
    public class EmployeeDataErrorException : Exception
    {
        public EmployeeDataErrorException() : base() { }
        public EmployeeDataErrorException(string message) : base(message) { }
    }
}

2. 修改設計畫面如下

clip_image001

引數設計如下

clip_image003

3. 修改IfElse Activity

clip_image004

4. 將throw拉到Then的活動區塊,並設定屬性

clip_image005

clip_image007

5. 在else拉一個WriteLine

clip_image008

6. 在catch設訂要補抓的例外(exception)

clip_image009

clip_image011

7. 在catch拉入WriteLine並顯示例外中的訊息

clip_image012

8. 最後設計畫面

clip_image014

9. 主程式如同在ForEach的範例不變


using System.Linq;
using System.Activities;
using System.Activities.Statements;
using System.Collections.Generic;


namespace HelloWordWF
{

    class Program
    {
        static void Main(string[] args)
        {
           //建立引數物件EmployeeData
            EmployeeData empdata = new EmployeeData(){
                CompanyID = 123,
            };
            empdata.items.Add(new EmployeeDataItem()
            {
                EmpId = "a1",
                EmpName = "李阿貓",
                Salary = Decimal.Parse("1000")
            });
            empdata.items.Add(new EmployeeDataItem()
            {
                EmpId = "a2",
                EmpName = "李阿狗",
                Salary = Decimal.Parse("2000")
            });
            empdata.items.Add(new EmployeeDataItem()
            {
                EmpId = "a3",
                EmpName = "李阿牛",
                Salary = Decimal.Parse("3000")
            });
            //workflow的引數參數要用Dinctionary<,>帶入
            IDictionary<string, object> input = new Dictionary<string, object>
            {
                //注意引數名稱方向為輸入
                {"EmployeeData",empdata}
            };
            //workflow的引數參數要用Dinctionary<,>輸出
            //注意引數名稱方向為輸出
            IDictionary<string,object> output = WorkflowInvoker.Invoke(new TestForEachAndTryCatch(),input);
            Console.WriteLine("總金額為:" + ((Decimal)output["OutputData"]).ToString());
            Console.WriteLine("請按Enter鍵後離開!");
            Console.Read();
        }       
    }
   
}

10. 輸出畫面

clip_image016

注意事項:

TryCatch只會跳離本身的Activity並到下一個Activity執行,如果要補抓到例外就跳離主程式要將整個流程用TryCatch包起來,如下圖

clip_image017

輸出結果

clip_image019