黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block
使用企业库异常处理应用程序模块的优势:
- 它支持整个应用程序体系结构层的异常处理,而不仅限于服务接口的界限。
- 它使得异常处理策略可以在管理层定义和维护,以便决策人员(可能是系统管理员和开发人员)可以定义如何处理异常。他们可以维护和修改控制异常处理的规则集,而无需更改块的应用程序代码。
- 它提供了常用的异常处理功能,例如记录异常信息的功能、通过将原始异常替换为其他异常来隐藏敏感信息的功能,以及通过将原始异常打包到另一个异常中来添加异常的上下文信息的功能。这些功能封装在名为 Exception handlers 的 .NET 类中。
- 它可以合并多个异常处理程序以产生某个异常所需的响应,例如先记录异常信息,再将原始异常替换为其他异常。
- 它使开发人员能够创建自己的异常处理程序。
- 它以一致的方式调用异常处理程序。这意味着,处理程序可以在应用程序之中和之间的多种场合下使用。
下面我们来试试看用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.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 Handlers—Add
Replace Handler,在建立好的Replace Handler面板中点击Replace Exception Type右边的…按钮,选择要替换成的异常类型,我们选择:System.TimeputException:

6. Save一下,更新App.config文件,修改源程序如下:
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.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.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[];
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,到此为止,我们将四个问题都解决了.
黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block的更多相关文章
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block 代理对象(Proxy Object) ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block 开发人员经常编写需要安全功能的应用程序.这些应用程序 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图: 从上图我们可以 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级) Caching Application Bl ...
随机推荐
- flask开发restful api
flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...
- C#实现环形队列
概述 看了一个数据结构的教程,是用C++写的,可自己C#还是一个菜鸟,更别说C++了,但还是大胆尝试用C#将其中的环形队列的实现写出来,先上代码: public class MyQueue<T& ...
- VC GDI双缓冲机制绘图防屏幕闪烁实现步骤
在OnDraw(CDC* pDC) 中添加如下代码 CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设 ...
- Java使用javax.mail.jar发送邮件并同意发送附件
因为Java在开发网页上占有绝大优势.所以作为web端的领军人物,譬如发送短信和发送邮件这些就成了必定,网络安全一再安全我们须要把账号的安全级别提到更高.因此这些对于开发者也就成了必须掌握的技能!我一 ...
- 新手推荐:IIS+PHP+MYSQL环境配置教程
本文介绍刚开始接触php的朋友如何为自己的服务器配置php环境 首先我们要的工具: 1.IIS:这个当然是不能少的了,用系统自带的就好了,这里就不教大家怎么装了. 2.PHP:php-5.2.0-wi ...
- 使用git微命令深入理解git工作机制
首先.这篇不是真正意义上的翻译,所以大家在看的时候不要找相应的英文文章相应着看.这篇文章之所以归类为翻译.是由于最開始有一篇英文文章让我对git内部机制有了清楚的认识,它能够说是我git的启蒙老师吧. ...
- RIO包 健壮的I/O函数代码
下面是关于 #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/t ...
- Oracle12C 怎样导入scott用户
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9uZ2thbmd3bA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- OpenCV HaarTraining代码解析(二)cvCreateMTStumpClassifier(建立决策树)
HaarTraining关键的部分是建立基分类器classifier,OpenCV中所採用的是CART(决策树的一种):通过调用cvCreateMTStumpClassifier来完毕. 这里我讨论利 ...
- 欧舒丹 L'Occitane 活力清泉保湿面霜 - 男士护肤 - 香港草莓网StrawberryNET.com
欧舒丹 L'Occitane 活力清泉保湿面霜 - 男士护肤 - 香港草莓网StrawberryNET.com 欧舒丹 活力清泉保湿面霜 50ml/1.7oz