Enterprise LibraryV1.0-异常处理应用程序块使用说明
其他几个应用程序块的使用说明连接如下:
Enterprise LibraryV1.0-概述
Enterprise LibraryV1.0-配置应用程序块
Enterprise LibraryV1.0-安全应用程序块使用说明
Enterprise LibraryV1.0-数据应用程序块
Enterprise LibraryV1.0-日志应用程序块使用说明
Enterprise LibraryV1.0-加密应用程序块使用说明
1、简介
只要是编写代码,我们就会面对异常处理的问题。系统预定义异常由于肩负着提示、调试等很多功能,因此当异常发生时,会有非常详细的异常信息。当我们编写商用程序时,如果程序出现运行时异常,显示给用户的信息都要求是user-friendly的,而不是系统级,特别是系统预定义异常会deliver一些敏感信息,如果被别有用心的人获取,是非常危险的,所以当异常出现时,我们要屏蔽掉这些敏感信息。对异常的处理一般有四种方式:
根据源异常建立一个新异常,重新将此新异常抛出。
取代源异常,抛出一个别的异常。
Log异常,用于查看、排错等。
不做任何处理,只是将传播路径截断。
虽然AOP是异常处理最佳方案,但技术上远未成熟,我们都还是用传统的方式来处理异常。对应这几种情况,我们一般都会这样来处理:
1) // 提示用户的处理方式,出错后提示用户
try
{
// 正常执行语句;
}
catch(Exception ex)
{
String formattedInfo = FormatException(ex);
Logging.Log(formattedInfo); // 或Logger.Log(e);
Throw new MyException("出错了。");
// 或者直接提示客户
//MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
//lblError.Text = errorMsg;
}
2) // logging,出错后作记录
catch(SomeException e)
{
string formattedInfo = FormatException(e);
Logger.Log(e);
throw e;
}
3) //replace,抛出一个新异常,屏蔽掉敏感信息
catch(SomeException e)
{
CustomException myException = new CustomException(“XXXXXXXXXXXXXXXXXXXXXX”);
throw myException;
}
4) //wrapping 包封原来的异常,添加Context信息后,重新抛出
catch(SomeException e)
{
CustomException myException = new CustomException(e);
throw myException;
}
5) //propagating 记录后,继续传播之
catch(SomeException e)
{
// Exception handling code to be done before propagating
string formattedInfo = FormatException(e);
Logger.Log(e);
throw e;
}
一般来说,象上面这样的处理方式都非常不灵活,有极大的代码重复,当要求发生变化时,可能源代码要做大量的机械修改。
异常处理应用程序块在充分满足上述异常处理要求的基础上,使我们在不同项目之间、同一个项目的不同开发人员之间建立起了统一的异常处理策略。当需求发生改变时,我们可以用配置工具进行修改配置文件,不用去修改源码,从而不用重新编译、发布程序。
我们知道,在.Net里一个异常发生时,系统会抛出一个Exception类型或其子代的对象,习惯上我们要对这个对象进行一些处理,以排除错误或提示用户,常见的处理方式有提示用户、包装后重新抛出、用另一个异常对象取而代之、记录等。EHAB就是根据这样的要求而设计的,但她并不负责具体如何处理,而是做了大量基础工作,使对异常的处理非常简单,同时统一了处理策略,增加了灵活性。
下面我们以常用的异常处理方式来说明异常处理应用程序块的用法,来看看使用EHAB是多么简单
2、用配置控制台配置异常处理应用程序块
①添加异常处理应用程序块
添加异常处理应用程序块后,就要添加一个或多个Exception Policy。一个异常处理应用程序块可以维护一个或多个Exception Policy,异常处理策略往往代表了对异常的处理方式,常见的策略有包封、取代、继续传播、处理并继续、记录等等,当然异常处理策略如何分类、有哪些异常处理策略,都是你自己说了算,只是取一个比较有意义的名字就行了。
每种Exception Policy可以管理多种类型的异常,而每种类型的Exception又可以有多个Handler(异常处理器,在Exception类的继承层次结构中,可以针对每种类型的Exception设置一个Handler,这样一个子代Exception就可以有多个Handler)。
②添加Exception Policy
添加几个Policy,适当修改Policy的名称,如Wrap Policy、Replace Policy、Log Policy、Propagate Policy、GlobalPolicy等。
③给每个Policy添加几个Exception
当添加一个Exception类型时,我们不用自己键入,向导会提示我们选一个,这个异常类型可以是系统预定义的,也可以是来自某个程序集的,还可以是我们自己定义的。
我们按自己的需要给每种Policy添加好Exception。然后针对每种类型的Exception设置处理活动PostHandlingAction。PostHandlingAction有三种分别是None、NotifyRethrow、ThrowNewException。
None表示此异常被内部处理掉了,调用者不用再处理了。
NotifyRethrow表示Application.ThreadException事件的处理器将重新抛出异常。
ThrowNewException表示这类异常你可以用一个新的异常类包封或取代之。
④设置Exception的处理器handler
每个Exception一般都会设置一个或多个handler,当然也可以不设。Replace Handler要设置好其取代的异常类型,Wrap Handler也要置好其包封的异常类型,Log Handler要置好LogCategory。
⑤设置完毕,保存。
3、写代码
String policy = “Wrap Policy”;
Try
{
// 。。。。。。。
}
catch (Exception ex)
{
if (ExceptionPolicy.HandleException(ex, policy))
throw;
}
其他类型Policy的代码与此类似,但异常的PostHandlingAction设为NotifyRethrow时,我们要将定义一个异常处理handler,并挂接到Application.ThreadException事件上。我们可以看到,对异常的不同处理方式其代码是一致的,而不象开始时我们列出的代码,不同的处理方式代码是不同的。