• 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

     

  • 相关阅读:
    EditorWindow 和MenuItem
    PropertyDrawer 自定义属性绘图
    NGUI3.5系列教程之 一些小功能的实现
    NGUI3.5系列教程之 UILabel
    关于Resources.LoadAssetAtPath
    C#调用Python 脚本语言
    unity项目实现“再按一次退出程序”提示功能
    在Visual Studio 2010 中创建类库(dll)
    Unity 优化
    JAVA package-info文件【转】
  • 原文地址:https://www.cnblogs.com/rickie/p/103862.html
Copyright © 2020-2023  润新知