科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件.NET 2.0中的企业库异常处理块简述

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

企业库异常处理块(Enterprise Library Exception Handling Block)提供了处理异常所需的所有基本代码

作者:谢启东编译 来源:天极开发 2007年11月3日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
使用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所示。


图3

  注意,app.config文件中的记录配置信息控制着日志项的格式。

  从本文中,你已看到,异常处理块提供了一组高度复用的类,由此就不必再重复编写那些操作、处理、记录异常的代码了;通过使用这些类,你可减少程序中错误、bug,及节省打字输入的时间,集中精力在程序的核心业务逻辑上,从而可极大地提高生产率。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章