Enterprise Library Step By Step系列(十一):异常处理应用程序块——入门篇
一.概述
使开发人员和决策人员能够针对发生在企业应用程序体系结构层的异常处理创建一致的策略。它的实现方法如下:
(1)它支持整个应用程序体系结构层的异常处理,而不仅限于服务接口的界限。
(2)它使得异常处理策略可以在管理层定义和维护,以便决策人员(可能是系统管理员和开发人员)可以定义如何处理异常。他们可以维护和修改控制异常处理的规则集,而无需更改块的应用程序代码。
(3)它提供了常用的异常处理功能,例如记录异常信息的功能、通过将原始异常替换为其他异常来隐藏敏感信息的功能,以及通过将原始异常打包到另一个异常中来添加异常的上下文信息的功能。这些功能封装在名为 Exception handlers 的 .NET 类中。
(4)它可以合并多个异常处理程序以产生某个异常所需的响应,例如先记录异常信息,再将原始异常替换为其他异常。
(5)它使开发人员能够创建自己的异常处理程序。
(6)它以一致的方式调用异常处理程序。这意味着,处理程序可以在应用程序之中和之间的多种场合下使用。
常见情况
异常处理应用程序块被设计为支持包含在应用程序组件的 catch 语句中的典型代码。该应用程序块允许开发人员将此逻辑封装为可重用的异常处理程序,而不是在应用程序组件的相同 catch 块中重复这段代码(例如,记录异常信息)。异常处理程序是封装异常处理逻辑和实现名为 IExceptionHandler 的异常处理应用程序块接口的 .NET 类。异常处理应用程序块包含三个异常处理程序:
包装处理程序:此异常处理程序可将一个异常包装到另一个异常中。
替换处理程序:此异常处理程序可将一个异常替换为另一个异常。
日志处理程序:此异常处理程序可格式化异常信息,例如消息和堆栈跟踪等。然后,日志处理程序将该信息提供给企业程序库日志和规范应用程序块,以便可以将它发布。
异常处理应用程序块可让您将异常类型与指定的策略相关联。您可以使用配置控制台来完成此项工作。策略可指定在应用程序块处理特定异常类型时执行的异常处理程序。您可以将这些处理程序串联起来,这样,在处理关联的异常类型时就可以执行一系列处理程序
二.几个重要的概念
1.策略:
确定一系列的异常类型是如何拦截并处理的
每一个策略可以包含多个异常类型
每个应用程序支持多个异常策略
2.异常类型:
可以使用Exception功能的异常类型应该是一个System.Exception类型或从此类继承下来的类
每一个异常类型可以包含一个或多个Handler
每一个异常均可以通过映射到.NET中的特定类型,从而被处理
3.处理器:
异常捕获后进行处理的方式有日志,包装,替换等;
每一个异常类型可以有多个异常处理器;
每一个异常捕获处理器均有机会修改原有异常;
每一个异常捕获处理器均有机会将自己的信息通过异常传递给下一个异常处理程序;
三.编写示例程序:
1.在开始进行配置之前,我们先编写一个异常包装的类。
2using System.Runtime.Serialization;
3
4namespace EnterpriseExceptionHandler
5{
6 /// <summary>
7 /// 功能说明:创建一个包装异常的类,需要继承ApplicationException
8 /// 程序作者:Terrylee
9 /// 编写日期:2005年11月13日
10 /// </summary>
11 public class ExceptionHelper:ApplicationException
12 {
13 /// <summary>
14 /// 默认的构造函数
15 /// </summary>
16 public ExceptionHelper() : base()
17 {
18
19 }
20
21 /// <summary>
22 /// 序列化错误信息
23 /// </summary>
24 /// <param name="message">错误信息</param>
25 public ExceptionHelper(string message) : base(message)
26 {
27
28 }
29
30 /// <summary>
31 /// 序列化错误信息,内部异常产生的原因.
32 /// </summary>
33 /// <param name="message">错误信息</param>
34 /// <param name="exception">引起当前的异常</param>
35 public ExceptionHelper(string message, Exception exception) : base(message, exception)
36 {
37
38 }
39
40 /// <summary>
41 /// 序列化数据
42 /// </summary>
43 /// <param name="info">序列化的数据对象</param>
44 /// <param name="context">描述.</param>
45 protected ExceptionHelper(SerializationInfo info, StreamingContext context) :base(info, context)
46 {
47
48 }
49 }
50}
51
2.打开配置工具,创建一个异常应用程序块。
3.创建一个策略。
4.命名为Wrap Policy。
5.创建一个异常类型Exception。
6.创建一个异常处理器,命名为Wrap Handler,选择它的WrapExceptionTypeName为我们刚才创建的那个异常包装类。
7.同样,再创建一个替换策略和日志策略,分别命名为Replace Policy和Log Policy,注意Log Policy依赖于日志和监测应用程序块。
8.拷贝目录(我每次都说,大家可能会觉着烦^_^,不过我自己总是忘了这一条,所以不得不每次提醒大家)。
9.在程序中编写代码(代码编写很简单)。
2 /// 包装策略
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void btn_Wrap_Click(object sender, System.EventArgs e)
7 {
8 try
9 {
10 Exception ex = new Exception();
11 throw ex;
12 }
13 catch(DllNotFoundException ex)
14 {
15 bool Flag = ExceptionPolicy.HandleException(ex,"Wrap Policy");
16
17 if(Flag)
18 {
19 throw;
20 }
21 }
22 ///我们可以多次捕获异常
23 catch(Exception ex)
24 {
25 bool Flag = ExceptionPolicy.HandleException(ex,"Wrap Policy");
26
27 if(Flag)
28 {
29 throw;
30 }
31 }
32 }
33
34 /// <summary>
35 /// 替换策略
36 /// </summary>
37 /// <param name="sender"></param>
38 /// <param name="e"></param>
39 private void btn_Replace_Click(object sender, System.EventArgs e)
40 {
41 try
42 {
43 Exception ex = new Exception();
44 throw ex;
45 }
46 catch(Exception ex)
47 {
48 bool Flag = ExceptionPolicy.HandleException(ex,"Replace Policy");
49
50 if(Flag)
51 {
52 throw;
53 }
54 }
55 }
56
57 /// <summary>
58 /// 日志策略
59 /// </summary>
60 /// <param name="sender"></param>
61 /// <param name="e"></param>
62 private void btn_Log_Click(object sender, System.EventArgs e)
63 {
64 try
65 {
66 Exception ex = new Exception();
67 throw ex;
68 }
69 catch(Exception ex)
70 {
71 bool Flag = ExceptionPolicy.HandleException(ex,"Log Policy");
72
73 if(Flag)
74 {
75 throw;
76 }
77 }
78 }
10.执行程序,单击日志策略。在事件查看器中查看相应的日志记录。