Enterprise Library 2.0 -- Exception Handing Applcation Block

           Enterprise Library 2.0 中的 Exception Handing Applcation Block 为我们开发人员以及设计人员提供了一个一致的方法去处理我们整个企业级应用程序的每个层次上的异常,表现在以下几个方面:

1、它为应用程序的架构的每个层提供异常处理方法,并不仅仅局限于服务层接口;
2、提供通用的异常处理方法,比如记录异常信息,使用我们自定义的异常信息来替换系统的异常信息等等;
3、我们可以自己定义异常处理的规则,并且可以不通过修改代码来修改异常处理的规则;
4、它支持我们开发者自己创建自己的异常处理方法;
5、通过同样的方法来调用异常处理方法,这使得异常处理可以用于应用程序的任何地方。

我们在进行异常处理时,一般采用一下策略:
1、包装
2、替换
3、日志

那么,Exception Handing Application Block 究竟能给我们得开发带来哪些好处呢?先看下面的代码:

None.gif DataSet customersDataSet;
None.gif
None.gif
try
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  customersDataSet 
= RunQuery("GetAllCustomers");
ExpandedBlockEnd.gif}

None.gif
catch (Exception ex)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
string formattedInfo = FormatException(ex);
InBlock.gif  Logging.Log(formattedInfo);
InBlock.gif  
throw new DataAccessException("Database access failure for query GetAllCustomers",e);
ExpandedBlockEnd.gif}

None.gif

上面的代码估计我们最熟悉不过了,不错,在我们的应用程序中这样的代码估计会贯穿我们的程序中的每一个角落,但是当我们处理异常的方法发生改变了的时候,我们就要对所有的代码进行修改,这是一件很郁闷的事情,Exception Handing Application Block的出现就为我们解决了这样的麻烦,使用Exception Handing Application Block后,我们只需要修改配置文件就可以改变应用程序中的所有异常处理方法。如下:

None.gif DataSet customersDataSet;
None.gif
None.gif
try
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  customersDataSet 
= RunQuery("GetAllCustomers");
ExpandedBlockEnd.gif}

None.gif
catch (Exception ex)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy");
InBlock.gif  
if (rethrow)
InBlock.gif    
throw;
ExpandedBlockEnd.gif}

其中 Data Access Policy 就是一个异常处理的策略,具体的配置和用法我们将在后面说到,当我们的异常处理方式需要改变的话,我们只需要修改配置文件即可,下面我们先来看一下Exception Handing Application Block的配置方法(以日志策略为例):

1、打开配置工具,新建一个Exception Handing Application Block;

6251.gif

2、选中我们刚刚新建的Exception Handing Application Block,右键单击,在弹出的菜单中选择New-->Exception Policy,新建一个异常处理的策略,命名为UI Policy;
6252.gif

6253.gif

3、在新建的异常处理策略下新建一个Exception Type,选择异常类型为System.Exception;
6254.gif

6255.gif

4、设置Exception的PostHandingAction为None,表示异常处理结束之后不执行任何操作,可选项还有ThrowNewException和NotifyRethrow;

6256.gif

5、接下来我们需要在Exception下新建一个Logging Handler
6257.gif

6、设置其FormatterType为Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter,然后设置LogCategory为DataBase,这里的DataBase是我在Logging Application Block中建的,具体配置方法可以参考下面的文章:
Enterprise Library 2.0 -- Logging Application Block (上)
Enterprise Library 2.0 -- Logging Application Block (下)
Enterprise Library 2.0 -- Logging Application Block (补充)

我们还可以设置其EventID,Name,Title等辅助信息:

6258.gif

7、上面的配置结束之后,我们保存我们的Project,就完成了一个日志策略的异常处理的配置,最终的配置文件如下:

None.gif <? xml version="1.0" encoding="utf-8" ?>
None.gif
< configuration >
None.gif  
< configSections >
None.gif    
< section  name ="exceptionHandling"  type ="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, 
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
  />
None.gif  
</ configSections >
None.gif  
< exceptionHandling >
None.gif    
< exceptionPolicies >
None.gif      
< add  name ="UI Policy" >
None.gif        
< exceptionTypes >
None.gif          
< add  type ="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
None.gif            postHandlingAction
="None"  name ="Exception" >
None.gif            
< exceptionHandlers >
None.gif              
< add  logCategory ="DataBase"  eventId ="100"  severity ="Error"  title ="Enterprise Library Exception Handling"
None.gif                formatterType
="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, 
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"

None.gif                priority
="0"  type ="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, 
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"

None.gif                name
="Logging Handler"   />
None.gif            
</ exceptionHandlers >
None.gif          
</ add >
None.gif        
</ exceptionTypes >
None.gif      
</ add >
None.gif    
</ exceptionPolicies >
None.gif  
</ exceptionHandling >
None.gif
</ configuration >

上面的配置做好之后,我们在程序可以根据下面的方法进行日志策略的异常处理:

None.gif try
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
// Run code.
ExpandedBlockEnd.gif
}

None.gif
catch (Exception ex)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
bool rethrow = ExceptionPolicy.HandleException(ex, "Logging Policy");
InBlock.gif  
if (rethrow)
InBlock.gif    
throw;
ExpandedBlockEnd.gif}

关于替换策略和封装策略的使用方法以及配置方法和日志策略基本上相同,这里就不在多说了。

异常处理这一块我们先说到这里,更深入的部分我会在以后的文章中继续和大家讨论,欢迎大家积极的讨论有关这方面的问题,只有相互交流才能达到共同进步!

Email:pwei013@163.com


转载于:https://www.cnblogs.com/pw/archive/2006/06/25/435179.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值