Enterprise Library: Exception Handling Application Block类设计分析

Exception Handling Application Block设计用来完成企业级应用程序各层中异常处理。

***

Exception Handling Application Block依赖项

Enterprise Library中的所有Application Blocks设计用于相互联合使用。有时,有些Application Blocks依赖于其他Enterprise LibraryApplication Blocks和代码。Exception Handling Application Block有如下依赖项:

l         Enterprise Library Configuration Application Block Exception Handling Application Block使用该CAB读取配置信息。

l         Common library functionality,如instrumentation 该类库为暴露事件和系统管理数据提供了不同的功能。

Application Block包括用来记录异常信息的异常处理程序(Exception Handler),使用Logging异常处理程序需要Logging and Instrumentation Application Block,下面的类库关系图清楚显示这一点。

缺省情况下,Application Block使用XML文件存放配置信息,推荐使用Configuration Console配置工具来编辑配置文件。

 

Exception Handling Application Block设计

Exception Handling Application Block设计达到如下目标:

l         将执行大部分通用异常处理任务的逻辑封装为最小的应用程序代码。

l         减轻开发人员为通用异常处理任务编写重复代码和定制代码。

l         允许在异常处理policies部署后也可改变,并且确保改变的同时性和一致性。

l         包含异常处理的最佳实践。

 

下图显示了Exception Handling Application Block中主要类之间的交互关系:
Enterprise_EHAB_ClassRelationship.JPG

其中Configuration Application BlockLogging Application BlockEnterprise Library提供的另外2Application Blocks,分别用来读取配置信息和记录异常日志。

Client端调用ExceptionPolicy.HandleException方法,并传入Exception Policy名称。每一个Exception Policy下设定一个或多个不同的Exception Types,每一个Exception Type又包含一个或多个Exception Handlers

Wrap HandlerLogging HandlerReplace Handler和定制Handler都是异常处理程序(Exception Handler),这些Exception Handlers都实现IExceptionHandler接口或继承ExceptionHandler抽象类。


Handler总是以配置的顺序执行,每一个Handler都会对Exception执行一些操作(如包装,替换等等),并将当前的Exception沿着Handler链传递到下一个Handler

 

一旦配置的Handler执行后,就产生对应的post-handling动作,该动作有如下选项:

  • None 没有重抛异常的动作。
  • NotifyRethrow 告诉调用程序:Policy推荐应该重抛异常。
  • ThrowNewException 在所有的Handler执行后,向调用程序抛出最终异常(并不一定是原始的异常)。

 

如下是简单的示例代码:

try
{
    customersDataSet 
= RunQuery(“GetAllCustomers”);
}

catch (Exception ex)
{
    
bool rethrow = ExceptionPolicy.HandleException(ex, “Data Access Policy”);
    
if (rethrow)
        
throw;
}


 

你可以通过Configuration Console配置工具来完成配置文件的定义,首先添加Exception Handling Application Block到配置文件中。然后需要定义Exception Policy,每一个Exception Policy包含一个或多个Exception Types(如System.ArgumentException),并且每一个Exception Type又包含一个或多个Exception Handlers

 

另外,Application Block提供了2Formatters,用来记录或显示详细异常信息:TextExceptionFormatterXmlExceptionFormatterFormatter使用反射机制遍历所有Exception成员,并以TextXML形式输出,这与当前的Exception Management Application Block(注:Microsoft以前提供的异常处理程序块)处理方式比较相似。

你也可以通过实现ExceptionHandler抽象类,来创建定制的Handler

public abstract class ExceptionHandler : ConfigurationProvider, IExceptionHandler

该抽象类继承ConfigurationProvider类,并实现IExceptionHandler接口。ConfigurationProvider抽象类实现了IConfigurationProvider接口,用来读取配置数据。

public abstract class ConfigurationProvider : IConfigurationProvider

 

Enterprise Library提供的Quick start for Exception Handling Application Block中,提供了定制Handler的实现:

  

/// <summary>

  
/// Summary description for GlobalPolicyExceptionHandler.

  
/// </summary>


  
public   class  AppMessageExceptionHandler : ExceptionHandler
  
{

    
public AppMessageExceptionHandler()
    
{
    }


    
public override void Initialize(ConfigurationView configurationView)
    
{
    }


     
public override Exception HandleException(Exception exception, string policyName, Guid correlationID)
    
{
      DialogResult result 
= this.ShowThreadExceptionDialog(exception);

      
// Exits the program when the user clicks Abort.
      if (result == DialogResult.Abort)
        Application.Exit();
      
return exception;
    }


    
// Creates the error message and displays it.
    private DialogResult ShowThreadExceptionDialog(Exception e)
    
{
      
string errorMsg = e.Message + Environment.NewLine + Environment.NewLine;
      
return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }


  }

上述定制 Handler 用来处理应用程序中所有未捕获的异常信息,配置在 Global Policy 下,如下所示:
Enterprise_EHAB_ConfigurationConsole.jpg
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值