[en] http://msdn2.microsoft.com/en-us/library/aa480461.aspx
[ch] http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/dnpag2crypto1.mspx?mfr=true
1. 解決的問題:
(1) 它支持整個應用程序體系結構層的異常處理,而不僅限于服務接口的界限。
(2) 它使得異常處理策略可以在管理層定義和維護,以便決策人員(可能是系統管理員和開發人員)可以定義如何處理異常。他們可以維護和修改控制異常處理的規則集,而無需更改塊的應用程序代碼。
(3) 它提供了常用的異常處理功能,例如記錄異常信息的功能、通過將原始異常替換為其他異常來隱藏敏感信息的功能,以及通過將原始異常打包到另一個異常中來添加異常的上下文信息的功能。這些功能封裝在名為 exception handlers 的 .NET 類中。
(4) 它可以合并多個異常處理程序以產生某個異常所需的響應,例如先記錄異常信息,再將原始異常替換為其他異常。
(5) 它使開發人員能夠創建自己的異常處理程序。
(6) 它以一致的方式調用異常處理程序。這意味著,處理程序可以在應用程序之中和之間的多種場合下使用。
2. 適用場景:
異常處理應用程序塊被設計為支持包含在應用程序組件的 catch 語句中的典型代碼。該應用程序塊允許開發人員將此邏輯封裝為可重用的異常處理程序,而不是在應用程序組件的相同 catch 塊中重復這段代碼(例如,記錄異常信息)。異常處理程序是封裝異常處理邏輯和實現名為 IExceptionHandler 的異常處理應用程序塊接口的 .NET 類。異常處理應用程序塊包含四個異常處理程序:
(1) 包裝處理程序(Wrap Handler)。此異常處理程序可將一個異常包裝到另一個異常中。
(2) 替換處理程序(Replace Handler)。此異常處理程序可將一個異常替換為另一個異常。
(3) 日志處理程序(Logging Handler)。此異常處理程序可格式化異常信息,例如消息和堆棧跟蹤等。然后,日志處理程序將該信息提供給企業程序庫日志和規范應用程序塊,以便可以將它發布。
(4) Fault Contract Exception Handler. This exception handler is designed for use at Windows Communication Foundation(WCF) service boundaries, and generates a new Fault Contract from the exception.
異常處理應用程序塊可讓您將異常類型與指定的策略相關聯。您可以使用配置控制臺來完成此項工作。策略可指定在應用程序塊處理特定異常類型時執行的異常處理程序。您可以將這些處理程序串聯起來,這樣,在處理關聯的異常類型時就可以執行一系列處理程序。
3. 使用:
使用EntLib配置工具,New “EHAB”-> New “Exception Policy”->New “Exception Type”。可以創建如下幾種常用異常處理策略:
(1) Propagate Policy: 拋出原始異常;配置異常的PostHandlingAction=NotifyRethrow;
(2) Wrap Policy: 用另一個異常來包裝原始異常;配置異常的PostHandlingAction=ThrowNewException,添加Wrap Handler并配置WrapExceptionType指定為包裝后的異常類型(可以是自定義類型);
(3) Replace Policy: 用另一個異常來替換原始異常;配置PostHandlingAction=ThrowNewException,添加Replace Handler并配置ReplaceExceptionType指定為替換后的異常類型(可以是自定義類型);
(4) Handle and Resume Policy: 配置異常的PostHandlingAction=None;
(5) Log Only Policy(要用到LAB):配置異常的PostHandlingAction=None,添加Logging Handle,并為FormatterType指定一個Formatter;
(6) Notify Policy:Replace Policy + Log Only Policy.
try
{
// Run code.
}
catch(Exception ex)
{
bool rethrow = ExceptionPolicy.HandleException(ex, " * Policy");//上面創建的異常處理策略
if (rethrow)
throw;
}
4. Exception Handling Application Block的設計:


浙公網安備 33010602011771號