分享
 
 
 

.NET 2.0中的企业库异常处理块简述

王朝c#·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

企业库异常处理块(Enterprise Library Exception Handling Block)提供了处理异常所需的所有基本代码,现在,你可以不用再编写这些重复性的异常处理代码,只需简单地在程序中使用它们,就可保证一致且高效地异常处理。

在一个理想的程序世界中,编写的所有代码都是运行无误的,但现实是,无论你在编写代码时多么地小心,错误总会发生,所以,必须要有一个高效、可配置的框架(framework),以一种"优雅"方式来处理错误;另外,也必须要懂得,人们通常以对程序的用户体验带来多大影响,来衡量一种异常处理的有效性。因此,一个好的异常处理解决方案不单是从用户的观点"优雅"地处理错误,而且还可通过开发者或系统管理员以可配置的错误处理行为,提供健壮的配置设定,这也是异常处理块的关键组成部分。

与Enterprise Library 2.0一同到来的是崭新的异常处理应用程序块,自从老的异常管理应用程序块发布以来,其经过了巨大的改进,可从MSDN下载EntLib Caching Block获得。为有效地使用,你必须接受以下三个主要观点:

·异常处理是在你的代码探测到有异常发生时,处理异常的一个过程。

·异常日志记录是记录一个异常的过程,其包括发送格式化异常到事件记录器或发送一封E-mail,而异常处理块则利用了日志记录和事件记录。

·异常处理策略允许你控制异常处理和使用外部配置文件记录的行为,这样就的好处是,现在不用在代码中实施这样的规则了,换句话来说,你可在一个策略文件中定义异常处理,然后,在不改变代码的情况下,在测试、调试、产品定型期间修改行为以适应不同的异常处理需要。

另外,使用异常处理块,在探测到异常时,可做以下三件事情:

·你可把异常包装为一个新的异常,并加入新的上下文信息或错误详细信息。当新的异常传递到调用堆栈时,仍可通过InnerException属性访问到原始的异常。

·你可用一个新的异常取代原有异常。一般来说,这样做的目的,是不想让原始异常的详细信息传递出程序。

·你可以记录异常。当然,也可结合使用包装或取代的方法来达到此目的,或者,你可以记录原始异常并把它传递到调用堆栈。

使用异常处理块

在安装完企业库(Enterprise Library)之后,就可利用异常处理块开始编写代码了,为正确使用异常处理块,请遵循以下步骤:

1、在你的解决方案中分别添加一个对Microsoft.Practices.EnterpriseLibrary.Common.dll和Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll程序集的引用,可使用"添加引用"选项,并定位到X:\Program Files\Microsoft Enterprise Library January 2006\bin文件夹,如果还想使用异常处理日志记录,请再添加一个对Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll的引用。

2、像如下所示,在根<configuration>下的<configSections>中添加必要的项目到你的app.config(Windows Forms)或web.config(ASP.NET程序)文件。

<section

name="exceptionHandling"

type="Microsoft.Practices.

EnterpriseLibrary.

ExceptionHandling.

Configuration.

ExceptionHandlingSettings,

Microsoft.Practices.

EnterpriseLibrary.

ExceptionHandling" />

3、如果随同异常处理一块使用日志记录,还需要在<configSections>中加入以下设置。

<section

name="loggingConfiguration"

type="Microsoft.Practices.

EnterpriseLibrary.Logging.

Configuration.LoggingSettings,

Microsoft.Practices.

EnterpriseLibrary.Logging" />

4、接下来,直接在<configuration>下添加<exceptionHandling>,在<exceptionHandling>之内,你可添加所有的异常处理策略,以下的代码,表示在<exceptionHandling>中指定了一个名为"Global Policy"的策略。

<exceptionHandling>

<exceptionPolicies>

<add name="Global Policy">

<exceptionTypes>

<add name="Exception"

type="System.Exception,

mscorlib, Version=2.0.0.0,

Culture=neutral,

PublicKeyToken=b77a5c561934e089"

postHandlingAction="None">

<exceptionHandlers>

<add name="Application

Message Handler"

type="ExceptionMgmtBlockExample.

AppMessageExceptionHandler,

ExceptionMgmtBlockExample"/>

</exceptionHandlers>

</add>

</exceptionTypes>

</add>

</exceptionPolicies>

</exceptionHandling>

上述的设置指定了处理所有异常的一个策略。另外,使用<exceptionHandlers>项,你可指定一个自定义的异常处理方法,其将以适当的方式处理异常。在这个例子中,自定义异常处理方法实现为一个名为AppMessageExceptionHandler的类,而在本文的后面部分,将会看到AppMessageExceptionHandler类具体的实现。属性postHandlingAction指定了处理基于策略的异常的行为,此属性可接受以下值:None、NotifyRethrow、ThrowNewException。

添加这些设置最简单的方法就是使用企业库中的企业库配置工具(Enterprise Library Configuration Tool),在企业库配置工具中,上述设置如图1所示。

图1

5、 在你的工程中引入异常处理块的核心命名空间"Microsoft.Practices.EnterpriseLibrary.ExceptionHandling"。

6、 现在,就可使用上述命名空间中的类编写代码了。

使用ExceptionPolicy类

只要使用异常处理块,就必须要与ExceptionPolicy类打交道,由其引出的名为HandleException()的静态方法允许客户端程序与异常处理块相交互,在此可把策略作为参数提供。HandleException()方法使用一个类工厂来为相应的策略创建ExceptionPolicyImpl类型的对象,而ExceptionPolicyImpl对象拥有一个ExceptionPolicyEntry对象集--即在相应策略的配置文件中,每一种异常类型都对应于一个对象。对每一种异常类型,ExceptionPolicyEntry对象都包含了一个对象集,并由其实现了IExceptionHandler接口,当执行策略时,对象集就可提供异常处理块使用的序列;且每一个实现IExceptionHandler接口的对象都与对应于每种处理方法的类型相关联。

异常处理方法是 .NET类,其包装了异常处理逻辑,并实现了定义在异常处理块中的IExceptionHandler接口,默认状态下,异常处理块包含以下三种异常处理方法:

·包装处理方法:此异常处理方法用一个异常包装了另一个异常。

·取代处理方法:此异常处理方法用一个异常取代了另一个异常。

·日志记录处理方法:此异常处理方法对异常信息进行格式化处理,如通知和堆栈跟踪。日志记录处理方法将把这些信息登记入日志块,以作日后查证。

如果需要实现你自己的处理方法,通过使用企业库配置工具,也可自行扩展异常处理块。由此带来的最大好处是,你不必仅仅为了扩展它,而修改和重新构建整个程序。

使用ExceptionPolicy来处理异常

为演示异常处理块的使用,下面有一个简单的例子,例如一个名为ExceptionMgmtBlockExample 简单的Windows Form程序。在Visual Studio中创建此工程,添加前面所提到的引用,在窗体设计器中打开默认窗体,加入一个名为btnHandleException的命令按钮,修改它的单击事件如下:

private void btnHandleException_Click (object sender, EventArgs e)

{

try

{

throw new Exception("This is a test exception");

}

catch (Exception ex)

{

bool rethrow = ExceptionPolicy.HandleException (ex, "Global Policy");

if (rethrow)

{

throw;

}

}

}

在try块中,只是简单地抛出一个异常,而catch块将会捕捉到它,从而触发ExceptionPolicy类中的HandleException()方法,并在其中传递了一个"Golbal Policy"的策略名参数。正如前一节所提到的,"Golbal Policy"与名为AppMessageExceptionHandler的异常处理方法相关联,其声明如下:

using System;

using System.Collections.Specialized;

using System.Windows.Forms;

using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;

using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;

using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;

using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;

namespace ExceptionMgmtBlockExample

{

[ConfigurationElementType (typeof(CustomHandlerData))]

public class AppMessageExceptionHandler : IExceptionHandler

{

public AppMessageExceptionHandler(NameValueCollection ignore)

{}

public Exception HandleException (Exception exception, Guid correlationID)

{

DialogResult result = this.ShowThreadExceptionDialog (exception);

if (result == DialogResult.Abort)

Application.Exit();

return exception;

}

private DialogResult ShowThreadExceptionDialog(Exception e)

{

string errorMsg = e.Message + Environment.NewLine + Environment.NewLine;

return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);

}

}

}

正如你所看到的,自定义的异常处理方法继承自IExceptionHandler接口,而HandleException方法触发了另一个名为ShowThreadExceptionDialog的方法,其将格式化异常信息并在屏幕上显示。

如果你运行这个程序,并单击"Handle Exception"按钮,将看到图2所示的消息框。

图2

记录一个异常

除了处理异常之外,你也可对异常处理块进行配置以记录下异常。正如前面所提到的,可在日志记录块(Logging Block)的帮助之下完成这项工作,为进行日志记录的演示,再添加一个名为btnLogException的按钮,并修改它的单击事件如下:

private void btnLogException_Click(object sender, EventArgs e)

{

try

{

throw new Exception ("This is a test exception");

}

catch (Exception ex)

{

bool rethrow = ExceptionPolicy.HandleException (ex, "Log Only Policy");

if (rethrow)

{

throw;

}

}

}

通过传递异常对象(ex)和策略(本例中为Log Only Policy),catch块将会触发ExceptionPolicy.HandleException方法,与异常策略类似,你可在app.config或web.config文件中指定记录配置信息,例如,下面所示的app.config代码把"Log Only Policy"配置为<exceptionPolicies>下的一个子项:

<add name="Log Only Policy">

<exceptionTypes>

<add name="Exception"

type="System.Exception, mscorlib,

Version=2.0.0.0, Culture=neutral,

PublicKeyToken=b77a5c561934e089"

postHandlingAction="None">

<exceptionHandlers>

<add logCategory="Default Category"

eventId="100" severity="Error"

title="Exception Management

Application Exception"

priority="0"

formatterType="Microsoft.

Practices.EnterpriseLibrary.

ExceptionHandling.TextExceptionFormatter,

Microsoft.Practices.EnterpriseLibrary.

ExceptionHandling"

name="Logging Handler"

type="Microsoft.Practices.EnterpriseLibrary.

ExceptionHandling.Logging.

LoggingExceptionHandler,

Microsoft.Practices.EnterpriseLibrary.

ExceptionHandling.Logging"/>

</exceptionHandlers>

</add>

</exceptionTypes>

</add>

相应作为演示的目的,日志记录块只是简单地在"应用程序"项中记录下异常,如图3所示。

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有