企業庫異常處理塊(Enterprise Library Exception Handling Block)提供了處理異常所需的所有基本代碼
現在
你可以不用再編寫這些重復性的異常處理代碼
只需簡單地在程序中使用它們
就可保證一致且高效地異常處理
在一個理想的程序世界中
編寫的所有代碼都是運行無誤的
但現實是
無論你在編寫代碼時多麼地小心
錯誤總會發生
所以
必須要有一個高效
可配置的框架(framework)
以一種
優雅
方式來處理錯誤
另外
也必須要懂得
人們通常以對程序的用戶體驗帶來多大影響
來衡量一種異常處理的有效性
因此
一個好的異常處理解決方案不單是從用戶的觀點
優雅
地處理錯誤
而且還可通過開發者或系統管理員以可配置的錯誤處理行為
提供健壯的配置設定
這也是異常處理塊的關鍵組成部分
與Enterprise Library
一同到來的是嶄新的異常處理應用程序塊
自從老的異常管理應用程序塊發布以來
其經過了巨大的改進
可從MSDN下載EntLib Caching Block獲得
為有效地使用
你必須接受以下三個主要觀點
·異常處理是在你的代碼探測到有異常發生時
處理異常的一個過程
·異常日志記錄是記錄一個異常的過程
其包括發送格式化異常到事件記錄器或發送一封E
mail
而異常處理塊則利用了日志記錄和事件記錄
·異常處理策略允許你控制異常處理和使用外部配置文件記錄的行為
這樣就的好處是
現在不用在代碼中實施這樣的規則了
換句話來說
你可在一個策略文件中定義異常處理
然後
在不改變代碼的情況下
在測試
調試
產品定型期間修改行為以適應不同的異常處理需要
另外
使用異常處理塊
在探測到異常時
可做以下三件事情
·你可把異常包裝為一個新的異常
並加入新的上下文信息或錯誤詳細信息
當新的異常傳遞到調用堆棧時
仍可通過InnerException屬性訪問到原始的異常
·你可用一個新的異常取代原有異常
一般來說
這樣做的目的
是不想讓原始異常的詳細信息傳遞出程序
·你可以記錄異常
當然
也可結合使用包裝或取代的方法來達到此目的
或者
你可以記錄原始異常並把它傳遞到調用堆棧
使用異常處理塊
在安裝完企業庫(Enterprise Library)之後
就可利用異常處理塊開始編寫代碼了
為正確使用異常處理塊
請遵循以下步驟
在你的解決方案中分別添加一個對Microsoft
Practices
EnterpriseLibrary
Common
dll和Microsoft
Practices
EnterpriseLibrary
ExceptionHandling
dll程序集的引用
可使用
添加引用
選項
並定位到X:\Program Files\Microsoft Enterprise Library January
\bin文件夾
如果還想使用異常處理日志記錄
請再添加一個對Microsoft
Practices
EnterpriseLibrary
ExceptionHandling
Logging
dll的引用
像如下所示
在根<configuration>下的<configSections>中添加必要的項目到你的nfig(Windows Forms)或nfig(ASP
NET程序)文件
<section
name=
exceptionHandling
type=
Microsoft
Practices
EnterpriseLibrary
ExceptionHandling
Configuration
ExceptionHandlingSettings
Microsoft
Practices
EnterpriseLibrary
ExceptionHandling
/>
如果隨同異常處理一塊使用日志記錄
還需要在<configSections>中加入以下設置
<section
name=
loggingConfiguration
type=
Microsoft
Practices
EnterpriseLibrary
Logging
Configuration
LoggingSettings
Microsoft
Practices
EnterpriseLibrary
Logging
/>
接下來直接在<configuration>下添加<exceptionHandling>在<exceptionHandling>之內你可添加所有的異常處理策略以下的代碼表示在<exceptionHandling>中指定了一個名為Global Policy的策略
<exceptionHandling>
<exceptionPolicies>
<add name=Global Policy>
<exceptionTypes>
<add name=Exception
type=SystemException
mscorlib Version=
Culture=neutral
PublicKeyToken=bace
postHandlingAction=None>
<exceptionHandlers>
<add name=Application
Message Handler
type=ExceptionMgmtBlockExample
AppMessageExceptionHandler
ExceptionMgmtBlockExample/>
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
</exceptionPolicies>
</exceptionHandling>
上述的設置指定了處理所有異常的一個策略另外使用<exceptionHandlers>項你可指定一個自定義的異常處理方法其將以適當的方式處理異常在這個例子中自定義異常處理方法實現為一個名為AppMessageExceptionHandler的類而在本文的後面部分將會看到AppMessageExceptionHandler類具體的實現屬性postHandlingAction指定了處理基於策略的異常的行為此屬性可接受以下值NoneNotifyRethrowThrowNewException
添加這些設置最簡單的方法就是使用企業庫中的企業庫配置工具(Enterprise Library Configuration Tool)在企業庫配置工具中上述設置如圖所示
圖
在你的工程中引入異常處理塊的核心命名空間MicrosoftPracticesEnterpriseLibraryExceptionHandling
現在就可使用上述命名空間中的類編寫代碼了
使用ExceptionPolicy類
只要使用異常處理塊就必須要與ExceptionPolicy類打交道由其引出的名為HandleException()的靜態方法允許客戶端程序與異常處理塊相交互在此可把策略作為參數提供HandleException()方法使用一個類工廠來為相應的策略創建ExceptionPolicyImpl類型的對象而ExceptionPolicyImpl對象擁有一個ExceptionPolicyEntry對象集即在相應策略的配置文件中每一種異常類型都對應於一個對象對每一種異常類型ExceptionPolicyEntry對象都包含了一個對象集並由其實現了IExceptionHandler接口當執行策略時對象集就可提供異常處理塊使用的序列且每一個實現IExceptionHandler接口的對象都與對應於每種處理方法的類型相關聯
異常處理方法是 NET類其包裝了異常處理邏輯並實現了定義在異常處理塊中的IExceptionHandler接口默認狀態下異常處理塊包含以下三種異常處理方法
·包裝處理方法此異常處理方法用一個異常包裝了另一個異常
·取代處理方法此異常處理方法用一個異常取代了另一個異常
·日志記錄處理方法此異常處理方法對異常信息進行格式化處理如通知和堆棧跟蹤日志記錄處理方法將把這些信息登記入日志塊以作日後查證
如果需要實現你自己的處理方法通過使用企業庫配置工具也可自行擴展異常處理塊由此帶來的最大好處是你不必僅僅為了擴展它而修改和重新構建整個程序
使用ExceptionPolicy來處理異常
為演示異常處理塊的使用下面有一個簡單的例子例如一個名為ExceptionMgmtBlockExample 簡單的Windows Form程序在Visual Studio中創建此工程添加前面所提到的引用在窗體設計器中打開默認窗體加入一個名為btnHandleException的命令按鈕修改它的單擊事件如下
private void btnHandleException_Click (object sender EventArgs e)
{
try
{
throw new Exception(This is a test exception);
}
catch (Exception ex)
{
bool rethrow = ExceptionPolicyHandleException (ex Global Policy);
if (rethrow)
{
throw;
}
}
}
在try塊中只是簡單地拋出一個異常而catch塊將會捕捉到它從而觸發ExceptionPolicy類中的HandleException()方法並在其中傳遞了一個Golbal Policy的策略名參數正如前一節所提到的Golbal Policy與名為AppMessageExceptionHandler的異常處理方法相關聯其聲明如下
using System;
using SystemCollectionsSpecialized;
using SystemWindowsForms;
using MicrosoftPracticesEnterpriseLibraryCommonConfiguration;
using MicrosoftPracticesEnterpriseLibraryCommonConfigurationObjectBuilder;
using MicrosoftPracticesEnterpriseLibraryExceptionHandling;
using MicrosoftPracticesEnterpriseLibraryExceptionHandlingConfiguration;
namespace ExceptionMgmtBlockExample
{
[ConfigurationElementType (typeof(CustomHandlerData))]
public class AppMessageExceptionHandler : IExceptionHandler
{
public AppMessageExceptionHandler(NameValueCollection ignore)
{}
public Exception HandleException (Exception exception Guid correlationID)
{
DialogResult result = thisShowThreadExceptionDialog (exception);
if (result == DialogResultAbort)
ApplicationExit();
return exception;
}
private DialogResult ShowThreadExceptionDialog(Exception e)
{
string errorMsg = eMessage + EnvironmentNewLine + EnvironmentNewLine;
return MessageBoxShow(errorMsg Application Error MessageBoxButtonsOK MessageBoxIconStop);
}
}
}
正如你所看到的自定義的異常處理方法繼承自IExceptionHandler接口而HandleException方法觸發了另一個名為ShowThreadExceptionDialog的方法其將格式化異常信息並在屏幕上顯示
如果你運行這個程序並單擊Handle Exception按鈕將看到圖所示的消息框
圖
記錄一個異常
除了處理異常之外你也可對異常處理塊進行配置以記錄下異常正如前面所提到的可在日志記錄塊(Logging Block)的幫助之下完成這項工作為進行日志記錄的演示再添加一個名為btnLogException的按鈕並修改它的單擊事件如下
private void btnLogException_Click(object sender EventArgs e)
{
try
{
throw new Exception (This is a test exception);
}
catch (Exception ex)
{
bool rethrow = ExceptionPolicyHandleException (ex Log Only Policy);
if (rethrow)
{
throw;
}
}
}
通過傳遞異常對象(ex)和策略(本例中為Log Only Policy)catch塊將會觸發ExceptionPolicyHandleException方法與異常策略類似你可在nfig或nfig文件中指定記錄配置信息例如下面所示的nfig代碼把Log Only Policy配置為<exceptionPolicies>下的一個子項
<add name=Log Only Policy>
<exceptionTypes>
<add name=Exception
type=SystemException mscorlib
Version= Culture=neutral
PublicKeyToken=bace
postHandlingAction=None>
<exceptionHandlers>
<add logCategory=Default Category
eventId= severity=Error
title=Exception Management
Application Exception
priority=
formatterType=Microsoft
PracticesEnterpriseLibrary
ExceptionHandlingTextExceptionFormatter
MicrosoftPracticesEnterpriseLibrary
ExceptionHandling
name=Logging Handler
type=MicrosoftPracticesEnterpriseLibrary
ExceptionHandlingLogging
LoggingExceptionHandler
MicrosoftPracticesEnterpriseLibrary
ExceptionHandlingLogging/>
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
相應作為演示的目的日志記錄塊只是簡單地在應用程序項中記錄下異常如圖所示
圖
注意nfig文件中的記錄配置信息控制著日志項的格式
從本文中你已看到異常處理塊提供了一組高度復用的類由此就不必再重復編寫那些操作處理記錄異常的代碼了通過使用這些類你可減少程序中錯誤bug及節省打字輸入的時間集中精力在程序的核心業務邏輯上從而可極大地提高生產率
From:http://tw.wingwit.com/Article/program/net/201311/11494.html