黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

使用企业库异常处理应用程序模块的优势:

  1. 它支持整个应用程序体系结构层的异常处理,而不仅限于服务接口的界限。
  2. 它使得异常处理策略可以在管理层定义和维护,以便决策人员(可能是系统管理员和开发人员)可以定义如何处理异常。他们可以维护和修改控制异常处理的规则集,而无需更改块的应用程序代码。
  3. 它提供了常用的异常处理功能,例如记录异常信息的功能、通过将原始异常替换为其他异常来隐藏敏感信息的功能,以及通过将原始异常打包到另一个异常中来添加异常的上下文信息的功能。这些功能封装在名为 Exception handlers 的 .NET 类中。
  4. 它可以合并多个异常处理程序以产生某个异常所需的响应,例如先记录异常信息,再将原始异常替换为其他异常。
  5. 它使开发人员能够创建自己的异常处理程序。
  6. 它以一致的方式调用异常处理程序。这意味着,处理程序可以在应用程序之中和之间的多种场合下使用。

下面我们来试试看用EL5.0的异常处理模块到底能做些什么,按需求来做分析是最好的办法,那我们可以模拟的提出下列几个需求,看看用异常处理模块如何灵活的解决它们:

1.       希望能过滤程序中某些异常,即在发生这些异常的时候不会被抛出.要求是配置简单,只用修改一处地方就能控制所有相应的异常.

2.       发生某种异常的时候被自动替换成另外一个异常

3.       发生某种异常的时候被自动包装到另外一个异常中

4.       发生某种异常的时候被自动记录在指定的日志记录策略中,可以是记录到数据库或者文件中.

下面介绍如何使用Microsoft Enterprise Library 5.0中的异常处理程序模块来处理上面的问题:

1.      运行EntLibConfig.exe, 选择Blocks菜单 ,单击 Add Exception Handling Settings .

2.      为了模拟第一个问题,我们要先删除原有的All Exceptions,因为它表示所有的异常均截取,我们删除了它,再在Policy面板上右键—Add Exception Type,在弹出的异常类型选择窗口中,我们选择一个异常System.FormatException:

3.       点击 File菜单,单击 Save,保存为一个App.config文件,可以先保存到桌面,之后要用到它.

4.       创建一个新的控制台应用程序,将App.config添加到程序内,并加入需要的Dll文件,并添加需要的引用:

添加引用:

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

测试:

代码

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Specialized;

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

namespace test
{
class Program
{
staticvoid Main(string[] args)
{
bool haveException =false;

ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();

try
{
//FormatException异常捕获设置为None,将不会被抛出
em.Process(NoThrowException, "Policy");
}
catch (Exception)
{
haveException =true;
Console.WriteLine("捕获到异常!");
}

if (haveException ==false)
{
Console.WriteLine("未捕获到任何异常!");
}
}

privatestaticvoid NoThrowException()
{
int i = Int32.Parse("A");
Console.WriteLine("发生异常,不执行该指令");
}
}
}

运行结果:

到此为止,我们已经解决了第一个问题,当你的程序想只过滤System.FormatException异常的时候,可以用上面的方法实现,如果想过滤其他的异常,只用在EL5中添加即可,无需更改程序中的任何代码.

5.       下面我们来解决第二个问题,让我们回到EL5.0,在Policy面板上右键—Add Exception Type,在弹出的异常类型选择窗口中,我们选择一个异常System.IO.FileNotFoundException,再在FileNotFoundException面板上右键—Add HandlersAdd Replace Handler,在建立好的Replace Handler面板中点击Replace Exception Type右边的…按钮,选择要替换成的异常类型,我们选择:System.TimeputException:

6.       Save一下,更新App.config文件,修改源程序如下:

代码

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Specialized;

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

namespace test
{
class Program
{
staticvoid Main(string[] args)
{
//bool haveException = false;

ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();

//try
//{
////FormatException异常捕获设置为None,将不会被抛出
// em.Process(NoThrowException, "Policy");
//}
//catch (Exception)
//{
// haveException = true;
// Console.WriteLine("捕获到异常!");
//}

//if (haveException == false)
//{
// Console.WriteLine("未捕获到任何异常!");
//}

//FileNotFoundException异常捕获被设置为ThrowNewException,将被替换为TimeoutException异常
try
{
em.Process(ReplaceHandler, "Policy");
}
catch (TimeoutException e)
{
Console.WriteLine("捕获到TimeoutException异常!异常信息:"+ e.Message);
}
}

privatestaticvoid ReplaceHandler()
{
File.Open("test.txt", FileMode.Open);
Console.WriteLine("发生异常,不执行该指令");
}

privatestaticvoid NoThrowException()
{
int i = Int32.Parse("A");
Console.WriteLine("发生异常,不执行该指令");
}
}
}

7.       运行结果:

到此为止我们便解决了第二个问题,是不是很简单呀,这就是EL的便利之处~

8.       接着处理第三个问题,回到EL,在Policy面板上右键—Add Exception Type,在弹出的异常类型选择窗口中,我们选择一个异常System. NullReferenceException,再在NullReferenceException面板上右键—Add Handlers—Add Wrap Handler,在建立好的Wrap Handler面板中点击Wrap Exception Type右边的…按钮,选择要替换成的异常类型,我们选择: System.ApplicationException:

9.       Save一下,更新App.config文件,修改源程序如下:

代码

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Specialized;

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

namespace test
{
class Program
{
staticvoid Main(string[] args)
{
//bool haveException = false;

ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();

//try
//{
////FormatException异常捕获设置为None,将不会被抛出
// em.Process(NoThrowException, "Policy");
//}
//catch (Exception)
//{
// haveException = true;
// Console.WriteLine("捕获到异常!");
//}

//if (haveException == false)
//{
// Console.WriteLine("未捕获到任何异常!");
//}

//Console.WriteLine("-----------------------------------------------");
////FileNotFoundException异常捕获被设置为ThrowNewException,将被替换为TimeoutException异常
//try
//{
// em.Process(ReplaceHandler, "Policy");
//}
//catch (TimeoutException e)
//{
// Console.WriteLine("捕获到TimeoutException异常!异常信息:" + e.Message);
//}

//Console.WriteLine("-----------------------------------------------");
////NullReferenceException异常捕获被设置为ThrowNewException,将被包装为ApplicationException异常
try
{
em.Process(WrapHandler, "Policy");
}
catch (ApplicationException e)
{
Console.WriteLine("捕获到ApplicationException异常,其被包装的异常为{0}!", e.InnerException.GetType().ToString());
Console.WriteLine("异常信息:{0}", e.Message);
}
}

privatestaticvoid WrapHandler()
{
Hashtable ht =new Hashtable();
ht["test"].ToString();
Console.WriteLine("发生异常,不执行该指令");
}

privatestaticvoid ReplaceHandler()
{
File.Open("test.txt", FileMode.Open);
Console.WriteLine("发生异常,不执行该指令");
}

privatestaticvoid NoThrowException()
{
int i = Int32.Parse("A");
Console.WriteLine("发生异常,不执行该指令");
}
}
}

10.   运行结果:

到此为止,我们又解决了第三个问题.

11.   接着处理第四个问题,回到EL,在Policy面板上右键—Add Exception Type,在弹出的异常类型选择窗口中,我们选择一个异常System. NullReferenceException,再在NullReferenceException面板上右键—Add Handlers—Add Logging Exception Handler,将日志策略设置为文件记录方式,详细步骤在此不多讲,大家可以看看我之前写的日志处理模块教程:

12.   Save一下,更新App.config文件,修改源程序如下:

代码

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Specialized;

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

namespace test
{
class Program
{
staticvoid Main(string[] args)
{
//bool haveException = false;

ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();

//try
//{
////FormatException异常捕获设置为None,将不会被抛出
// em.Process(NoThrowException, "Policy");
//}
//catch (Exception)
//{
// haveException = true;
// Console.WriteLine("捕获到异常!");
//}

//if (haveException == false)
//{
// Console.WriteLine("未捕获到任何异常!");
//}

//Console.WriteLine("-----------------------------------------------");
////FileNotFoundException异常捕获被设置为ThrowNewException,将被替换为TimeoutException异常
//try
//{
// em.Process(ReplaceHandler, "Policy");
//}
//catch (TimeoutException e)
//{
// Console.WriteLine("捕获到TimeoutException异常!异常信息:" + e.Message);
//}

//Console.WriteLine("-----------------------------------------------");
////NullReferenceException异常捕获被设置为ThrowNewException,将被包装为ApplicationException异常
//try
//{
// em.Process(WrapHandler, "Policy");
//}
//catch (ApplicationException e)
//{
// Console.WriteLine("捕获到ApplicationException异常,其被包装的异常为{0}!", e.InnerException.GetType().ToString());
// Console.WriteLine("异常信息:{0}", e.Message);
//}

//Console.WriteLine("-----------------------------------------------");
//捕获ArgumentOutOfRangeException异常,并写入日志
try
{
em.Process(NotifyRethrow, "Policy");
}
catch (ArgumentOutOfRangeException)
{
Console.WriteLine("捕获到ArgumentOutOfRangeException异常,并写入日志!");
}
}

privatestaticvoid NotifyRethrow()
{
List<string> list =new List<string>();
string str = list[1];
Console.WriteLine("发生异常,不执行该指令");
}

privatestaticvoid WrapHandler()
{
Hashtable ht =new Hashtable();
ht["test"].ToString();
Console.WriteLine("发生异常,不执行该指令");
}

privatestaticvoid ReplaceHandler()
{
File.Open("test.txt", FileMode.Open);
Console.WriteLine("发生异常,不执行该指令");
}

privatestaticvoid NoThrowException()
{
int i = Int32.Parse("A");
Console.WriteLine("发生异常,不执行该指令");
}
}
}

13.   运行结果:

打开工程目录下的rolling.log文件:

OK,到此为止,我们将四个问题都解决了.

测试程序可以点击这里下载\(^  ^ \)

posted on 2014-03-05 11:11 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3582019.html

黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block相关推荐

  1. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block

    代理对象(Proxy Object)会通过Handler链定位到真实对象(Real Object),而Policy则被注入到代理对象和真实对象中.整个流程如图: 我个人对Policy Injectio ...

  2. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  3. 黄聪mysql_黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Acc

    企业库数据库访问模块通过抽象工厂模式 , 允许用户通过简单的配置选择不同的数据库作为程序的数据源 , 大大解决了切换数据库时带来的麻烦 . 因为我本机只安装了 SQL Server 2005, 所以在 ...

  4. Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    企业库加密应用程序模块提供了2种方式让用户保护自己的数据: Hashingproviders:  离散加密法, 简单来说就是把你的信息保存到内存中后用一个离散值表示并返回给程序,这样在程序中只能看到离 ...

  5. 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

    企业库日志应用程序模块工作原理图:   从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter ...

  6. Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block

    企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了SQL Server 2005,所以在此只做SQL的演 ...

  7. Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)

    企业库加密应用程序模块提供了2种方式让用户保护自己的数据: Hashingproviders:  离散加密法, 简单来说就是把你的信息保存到内存中后用一个离散值表示并返回给程序,这样在程序中只能看到离 ...

  8. Microsoft Enterprise Library 5.0 系列(十) Configuration Application Block

    到目前为止,我们使用的模块都是在同一个配置文件中,这显然是不灵活的,我们希望每个功能模块能独立的在一个配置文件中体现,这样不仅易于管理,易于扩展,也易于阅读和分类.企业库当然考虑到了这个问题并且提供了 ...

  9. Microsoft Enterprise Library 5.0 系列(四) Logging Application Block

    企业库日志应用程序模块工作原理图: 从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter的信 ...

最新文章

  1. 学术-数学:哥德巴赫猜想
  2. JVM基本架构及生命周期
  3. 项目: 用C语言写一个图形化的音乐播放器 【C++ / C】
  4. nginx用户认证访问
  5. 简单的C++程序题总结
  6. springboot项目中日志分类
  7. 邮件服务器两种协议,邮件服务器协议
  8. 神经网络学习历程与总结
  9. Lisp尺寸标注增加前后缀_CAD图纸标注添加前后缀的方法
  10. 金三银四,Android高级开发面试题目,帮你助力
  11. python七大神级插件_Maya神级插件 SOuP 和OpenVDB
  12. php txt bom,使用 PHP 函数或者软件去除文件的 BOM 头字符 - 文章教程
  13. RTL8762DK UART(二)
  14. 基于php的酒店管理系统答辩ppt,基于PHP的连锁酒店管理系统毕业设计论文+任务书+开题报告+中期报告+答辩PPT+项目源码及数据库...
  15. HMM和Viterbi算法
  16. 检查网络端口是否正常
  17. 技巧|微信个性签名,汽车手动挡效果,你喜欢这样的吗?
  18. Vss2005 的使用方法
  19. JD 1421:Abor(概率统计)
  20. 黑马优购商城首页的实现

热门文章

  1. 金融科技是助力粤港澳大湾区发展的新动能
  2. NFS-Ganesha
  3. Kali Linux 的常用命令
  4. Django基础学习
  5. c语言万年历论文3000字,万年历C语言报告3
  6. 是德矢量网络分析仪基本介绍
  7. 解决Elasticsearch报错:exception [type=search_phase_execution_exception, reason=all shards failed]
  8. 【如何实现一个简单的canvas动态水球图】
  9. dvorak键盘_如何在计算机或电话上切换到Dvorak(和其他键盘布局)
  10. Python语法基础在线实验闯关_头歌实践教学平台