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提供了2个Formatters,用来记录或显示详细异常信息:TextExceptionFormatter和XmlExceptionFormatter。Formatter使用反射机制遍历所有Exception成员,并以Text或XML形式输出,这与当前的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下,如下所示:
***
作者: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