Enterprise Library Step By Step系列(十一):異常處理應用程序塊——入門篇
作者:Terrylee
一.概述
使開發人員和決策人員能夠針對發生在企業應用程序體系結構層的異常處理創建一致的策略。它的實現方法如下:
(1)它支持整個應用程序體系結構層的異常處理,而不僅限于服務接口的界限。
(2)它使得異常處理策略可以在管理層定義和維護,以便決策人員(可能是系統管理員和開發人員)可以定義如何處理異常。他們可以維護和修改控制異常處理的規則集,而無需更改塊的應用程序代碼。
(3)它提供了常用的異常處理功能,例如記錄異常信息的功能、通過將原始異常替換為其他異常來隱藏敏感信息的功能,以及通過將原始異常打包到另一個異常中來添加異常的上下文信息的功能。這些功能封裝在名為 Exception handlers 的 .NET 類中。
(4)它可以合并多個異常處理程序以產生某個異常所需的響應,例如先記錄異常信息,再將原始異常替換為其他異常。
(5)它使開發人員能夠創建自己的異常處理程序。
(6)它以一致的方式調用異常處理程序。這意味著,處理程序可以在應用程序之中和之間的多種場合下使用。
常見情況
異常處理應用程序塊被設計為支持包含在應用程序組件的 catch 語句中的典型代碼。該應用程序塊允許開發人員將此邏輯封裝為可重用的異常處理程序,而不是在應用程序組件的相同 catch 塊中重復這段代碼(例如,記錄異常信息)。異常處理程序是封裝異常處理邏輯和實現名為 IExceptionHandler 的異常處理應用程序塊接口的 .NET 類。異常處理應用程序塊包含三個異常處理程序:
包裝處理程序:此異常處理程序可將一個異常包裝到另一個異常中。
替換處理程序:此異常處理程序可將一個異常替換為另一個異常。
日志處理程序:此異常處理程序可格式化異常信息,例如消息和堆棧跟蹤等。然后,日志處理程序將該信息提供給企業程序庫日志和規范應用程序塊,以便可以將它發布。
異常處理應用程序塊可讓您將異常類型與指定的策略相關聯。您可以使用配置控制臺來完成此項工作。策略可指定在應用程序塊處理特定異常類型時執行的異常處理程序。您可以將這些處理程序串聯起來,這樣,在處理關聯的異常類型時就可以執行一系列處理程序
二.幾個重要的概念
1.策略:
確定一系列的異常類型是如何攔截并處理的
每一個策略可以包含多個異常類型
每個應用程序支持多個異常策略
2.異常類型:
可以使用Exception功能的異常類型應該是一個System.Exception類型或從此類繼承下來的類
每一個異常類型可以包含一個或多個Handler
每一個異常均可以通過映射到.NET中的特定類型,從而被處理
3.處理器:
異常捕獲后進行處理的方式有日志,包裝,替換等;
每一個異常類型可以有多個異常處理器;
每一個異常捕獲處理器均有機會修改原有異常;
每一個異常捕獲處理器均有機會將自己的信息通過異常傳遞給下一個異常處理程序;
三.編寫示例程序:
1.在開始進行配置之前,我們先編寫一個異常包裝的類。
using System;2
using System.Runtime.Serialization;3

4
namespace EnterpriseExceptionHandler5
{6
/// <summary>7
/// 功能說明:創建一個包裝異常的類,需要繼承ApplicationException8
/// 程序作者:Terrylee9
/// 編寫日期:2005年11月13日10
/// </summary>11
public class ExceptionHelper:ApplicationException12
{13
/// <summary>14
/// 默認的構造函數15
/// </summary>16
public ExceptionHelper() : base() 17
{18

19
}20

21
/// <summary>22
/// 序列化錯誤信息23
/// </summary>24
/// <param name="message">錯誤信息</param>25
public ExceptionHelper(string message) : base(message) 26
{27

28
}29

30
/// <summary>31
/// 序列化錯誤信息,內部異常產生的原因.32
/// </summary>33
/// <param name="message">錯誤信息</param>34
/// <param name="exception">引起當前的異常</param>35
public ExceptionHelper(string message, Exception exception) : base(message, exception) 36
{37

38
}39

40
/// <summary>41
/// 序列化數據42
/// </summary>43
/// <param name="info">序列化的數據對象</param>44
/// <param name="context">描述.</param>45
protected ExceptionHelper(SerializationInfo info, StreamingContext context) :base(info, context) 46
{47

48
}49
}50
}51

2.打開配置工具,創建一個異常應用程序塊。
3.創建一個策略。
4.命名為Wrap Policy。
5.創建一個異常類型Exception。
6.創建一個異常處理器,命名為Wrap Handler,選擇它的WrapExceptionTypeName為我們剛才創建的那個異常包裝類。
7.同樣,再創建一個替換策略和日志策略,分別命名為Replace Policy和Log Policy,注意Log Policy依賴于日志和監測應用程序塊。
8.拷貝目錄(我每次都說,大家可能會覺著煩^_^,不過我自己總是忘了這一條,所以不得不每次提醒大家)。
copy "$(ProjectDir)\*.config" "$(TargetDir)" > Nul9.在程序中編寫代碼(代碼編寫很簡單)。
/// <summary>2
/// 包裝策略3
/// </summary>4
/// <param name="sender"></param>5
/// <param name="e"></param>6
private void btn_Wrap_Click(object sender, System.EventArgs e)7
{8
try9
{10
Exception ex = new Exception();11
throw ex;12
}13
catch(DllNotFoundException ex)14
{15
bool Flag = ExceptionPolicy.HandleException(ex,"Wrap Policy");16

17
if(Flag)18
{19
throw;20
}21
}22
///我們可以多次捕獲異常23
catch(Exception ex)24
{25
bool Flag = ExceptionPolicy.HandleException(ex,"Wrap Policy");26

27
if(Flag)28
{29
throw;30
}31
}32
}33
34
/// <summary>35
/// 替換策略36
/// </summary>37
/// <param name="sender"></param>38
/// <param name="e"></param>39
private void btn_Replace_Click(object sender, System.EventArgs e)40
{41
try42
{43
Exception ex = new Exception();44
throw ex;45
}46
catch(Exception ex)47
{48
bool Flag = ExceptionPolicy.HandleException(ex,"Replace Policy");49

50
if(Flag)51
{52
throw;53
}54
}55
}56
57
/// <summary>58
/// 日志策略59
/// </summary>60
/// <param name="sender"></param>61
/// <param name="e"></param>62
private void btn_Log_Click(object sender, System.EventArgs e)63
{64
try65
{66
Exception ex = new Exception();67
throw ex;68
}69
catch(Exception ex)70
{71
bool Flag = ExceptionPolicy.HandleException(ex,"Log Policy");72

73
if(Flag)74
{75
throw;76
}77
}78
}10.執行程序,單擊日志策略。在事件查看器中查看相應的日志記錄。
結束語:異常處理應用程序塊相對于其他應用程序塊來說是比較簡單的,入門篇里就介紹這么多了J
Worktile,新一代簡單好用、體驗極致的團隊協同、項目管理工具,讓你和你的團隊隨時隨地一起工作。完全免費,現在就去了解一下吧。
https://worktile.com



浙公網安備 33010602011771號