Enterprise Library: Exception Handling Application Block概述

Enterprise Library: Exception Handling Application Block概述

 

Written by: Rickie Lee (rickieleemail#yahoo.com)

My blog:http://www.cnblogs.com/rickie

Exception Handling Application Block允许开发人员和policy制定者为整个企业级应用程序各层的异常处理创建一致的策略。

Exception Handling Application Block设计支持应用程序组件中catch语句块包含的典型代码,而不是重复相同的代码片断,如记录异常信息等,Application Block允许开发人员封装这些逻辑为重用的异常处理程序(Exception Handlers)。Exception Handling Application Block包括如下3个异常处理程序(Exception Hanlders):

  • Wrap handler:包装一个原始异常在另一个新异常之内,并且原始的异常对象将保留在InnerException属性中。
  • Replace handler:替换一个异常为另一个异常。
  • Logging handler:异常处理程序首先格式化异常信息,如消息和Stack trace,接着Logging handler传递信息到Enterprise Library Logging and Instrumentation Application Block并记录下来。

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

***

作者:Rickie Lee (rickieleemail#yahoo.com)

本文参考Enterprise Library: Exception Handling Application Block部分文档及Quick Start范例。

 

References:

1. Enterprise Library: Exception Handling Application Block

2. Rickie, Microsoft patterns & practices Enterprise Library January 2005 [中文稿], http://www.cnblogs.com/rickie/archive/2005/01/30/99443.html

3. Rickie, Enterprise Library released! http://www.cnblogs.com/rickie/archive/2005/01/29/99106.html

 

posted @ 2005-02-12 05:11  Rickie  阅读(6862)  评论(6编辑  收藏  举报