[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. 修改設計畫面如下
引數設計如下
3. 修改IfElse Activity
4. 將throw拉到Then的活動區塊,並設定屬性
5. 在else拉一個WriteLine
6. 在catch設訂要補抓的例外(exception)
7. 在catch拉入WriteLine並顯示例外中的訊息
8. 最後設計畫面
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. 輸出畫面
注意事項:
TryCatch只會跳離本身的Activity並到下一個Activity執行,如果要補抓到例外就跳離主程式要將整個流程用TryCatch包起來,如下圖
輸出結果