Enterprise Library Step By Step系列(十一):异常处理应用程序块——入门篇

Enterprise Library Step By Step系列(十一):异常处理应用程序块——入门篇

作者:Terrylee

一.概述

使开发人员和决策人员能够针对发生在企业应用程序体系结构层的异常处理创建一致的策略。它的实现方法如下:

1)它支持整个应用程序体系结构层的异常处理,而不仅限于服务接口的界限。

2)它使得异常处理策略可以在管理层定义和维护,以便决策人员(可能是系统管理员和开发人员)可以定义如何处理异常。他们可以维护和修改控制异常处理的规则集,而无需更改块的应用程序代码。

3)它提供了常用的异常处理功能,例如记录异常信息的功能、通过将原始异常替换为其他异常来隐藏敏感信息的功能,以及通过将原始异常打包到另一个异常中来添加异常的上下文信息的功能。这些功能封装在名为 Exception handlers .NET 类中。

4)它可以合并多个异常处理程序以产生某个异常所需的响应,例如先记录异常信息,再将原始异常替换为其他异常。

5)它使开发人员能够创建自己的异常处理程序。

6)它以一致的方式调用异常处理程序。这意味着,处理程序可以在应用程序之中和之间的多种场合下使用。

常见情况

异常处理应用程序块被设计为支持包含在应用程序组件的 catch 语句中的典型代码。该应用程序块允许开发人员将此逻辑封装为可重用的异常处理程序,而不是在应用程序组件的相同 catch 块中重复这段代码(例如,记录异常信息)。异常处理程序是封装异常处理逻辑和实现名为 IExceptionHandler 的异常处理应用程序块接口的 .NET 类。异常处理应用程序块包含三个异常处理程序:

包装处理程序:此异常处理程序可将一个异常包装到另一个异常中。

替换处理程序:此异常处理程序可将一个异常替换为另一个异常。

日志处理程序:此异常处理程序可格式化异常信息,例如消息和堆栈跟踪等。然后,日志处理程序将该信息提供给企业程序库日志和规范应用程序块,以便可以将它发布。

异常处理应用程序块可让您将异常类型与指定的策略相关联。您可以使用配置控制台来完成此项工作。策略可指定在应用程序块处理特定异常类型时执行的异常处理程序。您可以将这些处理程序串联起来,这样,在处理关联的异常类型时就可以执行一系列处理程序

二.几个重要的概念

1.策略:

确定一系列的异常类型是如何拦截并处理的

每一个策略可以包含多个异常类型

每个应用程序支持多个异常策略

2.异常类型:

可以使用Exception功能的异常类型应该是一个System.Exception类型或从此类继承下来的类

每一个异常类型可以包含一个或多个Handler

每一个异常均可以通过映射到.NET中的特定类型,从而被处理

3.处理器:

异常捕获后进行处理的方式有日志,包装,替换等;

每一个异常类型可以有多个异常处理器;

每一个异常捕获处理器均有机会修改原有异常;

每一个异常捕获处理器均有机会将自己的信息通过异常传递给下一个异常处理程序;

三.编写示例程序:

1.在开始进行配置之前,我们先编写一个异常包装的类。

 1None.gifusing System;
 2None.gifusing System.Runtime.Serialization;
 3None.gif
 4None.gifnamespace EnterpriseExceptionHandler
 5ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 6ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
 7InBlock.gif    /// 功能说明:创建一个包装异常的类,需要继承ApplicationException
 8InBlock.gif    /// 程序作者:Terrylee
 9InBlock.gif    /// 编写日期:2005年11月13日
10ExpandedSubBlockEnd.gif    /// </summary>

11InBlock.gif    public class ExceptionHelper:ApplicationException
12ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
13ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
14InBlock.gif        /// 默认的构造函数
15ExpandedSubBlockEnd.gif        /// </summary>

16InBlock.gif        public ExceptionHelper() : base() 
17ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
18InBlock.gif
19ExpandedSubBlockEnd.gif        }

20InBlock.gif
21ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
22InBlock.gif        /// 序列化错误信息
23InBlock.gif        /// </summary>
24ExpandedSubBlockEnd.gif        /// <param name="message">错误信息</param>

25InBlock.gif        public ExceptionHelper(string message) : base(message) 
26ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
27InBlock.gif
28ExpandedSubBlockEnd.gif        }

29InBlock.gif
30ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
31InBlock.gif        /// 序列化错误信息,内部异常产生的原因.
32InBlock.gif        /// </summary>
33InBlock.gif        /// <param name="message">错误信息</param>
34ExpandedSubBlockEnd.gif        /// <param name="exception">引起当前的异常</param>

35InBlock.gif        public ExceptionHelper(string message, Exception exception) : base(message, exception) 
36ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
37InBlock.gif
38ExpandedSubBlockEnd.gif        }

39InBlock.gif
40ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
41InBlock.gif        /// 序列化数据
42InBlock.gif        /// </summary>
43InBlock.gif        /// <param name="info">序列化的数据对象</param>
44ExpandedSubBlockEnd.gif        /// <param name="context">描述.</param>

45InBlock.gif        protected ExceptionHelper(SerializationInfo info, StreamingContext context) :base(info, context) 
46ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
47InBlock.gif
48ExpandedSubBlockEnd.gif        }

49ExpandedSubBlockEnd.gif    }

50ExpandedBlockEnd.gif}

51None.gif

2.打开配置工具,创建一个异常应用程序块。

 EE01.JPG

3.创建一个策略。

 EE02.JPG

4.命名为Wrap Policy

 EE03.JPG

5.创建一个异常类型Exception

 EE04.JPG

6.创建一个异常处理器,命名为Wrap Handler,选择它的WrapExceptionTypeName为我们刚才创建的那个异常包装类。

 EE05.JPG

7.同样,再创建一个替换策略和日志策略,分别命名为Replace PolicyLog Policy,注意Log Policy依赖于日志和监测应用程序块。

8.拷贝目录(我每次都说,大家可能会觉着烦^_^,不过我自己总是忘了这一条,所以不得不每次提醒大家)。

None.gifcopy "$(ProjectDir)\*.config" "$(TargetDir)" > Nul

9.在程序中编写代码(代码编写很简单)。

 1ExpandedBlockStart.gifContractedBlock.gif/**//// <summary>
 2InBlock.gif        /// 包装策略
 3InBlock.gif        /// </summary>
 4InBlock.gif        /// <param name="sender"></param>
 5ExpandedBlockEnd.gif        /// <param name="e"></param>

 6None.gif        private void btn_Wrap_Click(object sender, System.EventArgs e)
 7ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
 8InBlock.gif            try
 9ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
10InBlock.gif                Exception ex = new Exception();
11InBlock.gif                throw ex;
12ExpandedSubBlockEnd.gif            }

13InBlock.gif            catch(DllNotFoundException ex)
14ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
15InBlock.gif                bool Flag = ExceptionPolicy.HandleException(ex,"Wrap Policy");
16InBlock.gif
17InBlock.gif                if(Flag)
18ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
19InBlock.gif                    throw;
20ExpandedSubBlockEnd.gif                }

21ExpandedSubBlockEnd.gif            }

22ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////我们可以多次捕获异常
23InBlock.gif            catch(Exception ex)
24ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
25InBlock.gif                bool Flag = ExceptionPolicy.HandleException(ex,"Wrap Policy");
26InBlock.gif
27InBlock.gif                if(Flag)
28ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
29InBlock.gif                    throw;
30ExpandedSubBlockEnd.gif                }

31ExpandedSubBlockEnd.gif            }

32ExpandedBlockEnd.gif        }

33None.gif        
34ExpandedBlockStart.gifContractedBlock.gif        /**//// <summary>
35InBlock.gif        /// 替换策略
36InBlock.gif        /// </summary>
37InBlock.gif        /// <param name="sender"></param>
38ExpandedBlockEnd.gif        /// <param name="e"></param>

39None.gif        private void btn_Replace_Click(object sender, System.EventArgs e)
40ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
41InBlock.gif            try
42ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
43InBlock.gif                Exception ex = new Exception();
44InBlock.gif                throw ex;
45ExpandedSubBlockEnd.gif            }

46InBlock.gif            catch(Exception ex)
47ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
48InBlock.gif                bool Flag = ExceptionPolicy.HandleException(ex,"Replace Policy");
49InBlock.gif
50InBlock.gif                if(Flag)
51ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
52InBlock.gif                    throw;
53ExpandedSubBlockEnd.gif                }

54ExpandedSubBlockEnd.gif            }

55ExpandedBlockEnd.gif        }

56None.gif        
57ExpandedBlockStart.gifContractedBlock.gif        /**//// <summary>
58InBlock.gif        /// 日志策略
59InBlock.gif        /// </summary>
60InBlock.gif        /// <param name="sender"></param>
61ExpandedBlockEnd.gif        /// <param name="e"></param>

62None.gif        private void btn_Log_Click(object sender, System.EventArgs e)
63ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
64InBlock.gif            try
65ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
66InBlock.gif                Exception ex = new Exception();
67InBlock.gif                throw ex;
68ExpandedSubBlockEnd.gif            }

69InBlock.gif            catch(Exception ex)
70ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
71InBlock.gif                bool Flag = ExceptionPolicy.HandleException(ex,"Log Policy");
72InBlock.gif
73InBlock.gif                if(Flag)
74ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
75InBlock.gif                    throw;
76ExpandedSubBlockEnd.gif                }

77ExpandedSubBlockEnd.gif            }

78ExpandedBlockEnd.gif        }

10.执行程序,单击日志策略。在事件查看器中查看相应的日志记录。

结束语:异常处理应用程序块相对于其他应用程序块来说是比较简单的,入门篇里就介绍这么多了J

转载于:https://www.cnblogs.com/Terrylee/archive/2005/11/14/275659.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt商业版和开源版的区别_微擎商业版系统V2.0.9全开源版纯净框架

微擎商业版系统V2.0.9全开源版纯净框架_全新界面无后门无任何限制。该源码不含任何安装模块&#xff0c;最重要的是该版本是一键安装版&#xff0c;主要你上传到服务器上&#xff0c;然后直接运行域名就会直接进入安装环境&#xff0c;不会像网络上的其他版本&#xff0c;还需要…

Jibx Jersey2集成

Jersey2为Jackson和JAXB提供内置支持。 但是默认情况下不支持Jibx。 要将Jibx与Jersey2结合使用&#xff0c;我们将XML输入作为流&#xff0c;并在接收到请求之后&#xff0c;使用Jibx对其进行解析。 但是实际上&#xff0c;有更好的方法可以使用MessageBodyReader和MessageBod…

js 的起源故事

"1994年&#xff0c;网景公司&#xff08;Netscape&#xff09;发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器&#xff0c;轰动一时。但是&#xff0c;这个版本的浏览器只能用来浏览&#xff0c;不具备与访问者互动的能力。......网景公司急需一种网…

CMD命令也要用好

以前一些程序需要执行一些Dos命令&#xff0c;一般都是写成一个Bat文件&#xff0c;然后通过Shel来调用&#xff0c;实际上一些简单得用法完全可以这样用&#xff1a;VBA.Shell "cmd /c cmd /? > c:\cmdhelp.txt"VBA.Shell "cmd /c Type c:\cmdhelp.txt >…

网络上各台计算机语言,人类使用语言来交流,同样,网络上的各台计算机之间也用某种语言交换信息,这样的语言通常指()。...

相关题目与解析计算机语言是一种人与计算机之间交换信息的工具。案例2&#xff1a;计算机网络漫谈所谓计算机网络&#xff0c;就是把分布在不同地理区域的计算机与专门的外部设备用通信计算机语言是用来解决人和计算机交换信息的。关于汇编语言的说法错误的是()计算机语言是用来…

og4j日志文件乱码问题的解决方法

现象&#xff1a;在默认语言非中文&#xff08;或者说默认语言不支持中文的&#xff09;的Windows、Linux、Unix上&#xff0c;用log4j打印日志&#xff0c;出现乱码&#xff0c;常见的就是一堆问号。 解决方法&#xff1a; 如果是log4j.properties为配置文件&#xff0c;比如&…

设计模式中的六大基本原则

软件设计中的基本共识&#xff1a; 1&#xff0c;高内聚&#xff0c;低耦合&#xff1a;如果想使软件系统架构稳定&#xff0c;那么我们期望软件的各模块内元素结合的紧密&#xff0c;而模块之间的耦合度&#xff08;关联性&#xff09;越低越好。高内聚不仅体现在模块上&#…

广元南山隧道南河互通立交图_广元城区一隧道工程竣工时间已定,今后出行更加方便了!...

4月15日&#xff0c;伴着轰隆的机械声&#xff0c;记者踏入国道212线南山隧道工程项目建设现场&#xff0c;突然眼前飘来一阵细密小雨&#xff0c;抬头望去&#xff0c;原来是建设边坡上一排白色雾炮机正在进行降尘作业。记者看到&#xff0c;数控钢筋加工厂内工人们正抓紧预制…

Java EE 7:新增功能???

我有点“晚点”&#xff0c;可以这么说……就Java EE 7的 “博客”而言。 自2013年6月发布以来&#xff0c;已经差不多10个月了 &#xff0c;但是它仍然相对较新。 就我个人而言&#xff0c;仅仅是因为它的易用性和所购买的功能范围之广&#xff0c;我对此感到很兴奋。但是&…

浏览器的同源策略及跨域解决方案

同源策略 一个源的定义 如果两个页面的协议&#xff0c;端口&#xff08;如果有指定&#xff09;和域名都相同&#xff0c;则两个页面具有相同的源。 举个例子&#xff1a; 下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: URL结果原因http://a.xyz.com/dir2/ot…

sass继承

extend sass中&#xff0c;选择器继承可以让选择器继承另一个选择器的所有样式&#xff0c;并联合声明。使用选择器的继承&#xff0c;要使用关键词extend&#xff0c;后面紧跟需要继承的选择器。 scss.style css.style 从sass 3.2.0以后就可以定义占位选择器%。 这种选择器…

论中国传统辩证推理科学理论范式(ZZ)

摘要&#xff1a;西方科学的形式逻辑以一系列相互独立的公理、设定、经验模型等为大前提&#xff0c;以不矛盾的逻辑为推理手段&#xff0c;构建其系统的科学理论&#xff0c;决定了其理论体系下的世界是众多不连续的带状、绳索状或网状结构的共存体&#xff0c;而不可能是一个…

计算机病毒及其防治评课,区初中信息技术教研活动公开课评课感想

今天上午&#xff0c;在我校成功举行了区初中信息技术教研活动&#xff0c;总共开设了三节课&#xff0c;都是由我校老师执教的。听后受益匪浅&#xff0c;感受颇深&#xff0c;以下是本人的评课感想。一、首先说一下三位老师的共同点&#xff1a;1、三位老师都用了导学案&…

Django—路由层,视图层

路由层urls 浏览器会自动给url后加一个“/” django会自动给路由的正则表达式前面加一个“/” django会给任何不带“/”结尾的url语句添加“/”&#xff08;可设置&#xff09; 短路路由规则&#xff1a;匹配到第一条就忽略后面所有&#xff01; 所以路由顺序很重要&#xff01…

分数怎么化成带分数_人教版五年级下册第4单元带分数及把假分数化成整数或带分数教学视频+知识点...

|点击题目下方蓝字一键关注 小学生知识库|【教学视频】分数的分类与互化【知识点】带分数的意义和特征&#xff1a;像…这样由整数和真分数合成的数叫做带分数。假分数化成整数或带分数的方法是什么&#xff1f;①当假分数的分子是分母的倍数时&#xff0c;这个假分数可以化成整…

Java 8功能教程– ULTIMATE指南(PDF下载)

编者注&#xff1a;在本文中&#xff0c;我们提供了全面的Java 8功能教程。 自Java 8公开发布以来已经有一段时间了&#xff0c;所有迹象都表明这是一个非常重要的版本。 我们在Java Code Geeks处提供了大量教程&#xff0c;例如“ 玩Java 8 – Lambda和并发” &#xff0c;“…

盆景

dvbbs收藏本页联系我们论坛帮助dvbbs恢复默认设置登录注册 搜索风格论坛状态论坛展区道具中心我能做什么 >> 优秀作品欣赏、个人作品展示。(The excellent work enjoys, personal work demonstration) 搜一搜相关精彩主题 盆景艺术在线论坛 → 盆景论坛(penjing Forum) →…

计算机硬件系统的构成教学设计,2.1 计算机硬件系统教学设计思路

第二章&#xff1a;计算机的硬件和软件第一节&#xff1a;计算机的硬件构成一、教材分析本节的重点是冯.诺依曼存储程序思想以及相应的计算机机硬件逻辑结构。通过对计算机五大逻辑部件的理解从而更好的掌握计算机在处理信息时的工作流程。同时要求学生能够识别常见的计算机设备…

小程序左右标签滑块排行榜

小程序左右标签滑块排行榜 效果: <view class"menu"><view class"{{currentTab0?select:default}}" data-current"0" bindtap"switchNav">成绩</view><view class"{{currentTab1?select:default}}" …

mysql pxc_MySQL之PXC集群搭建

一、PXC 介绍1.1 PXC 简介PXC 是一套 MySQL 高可用集群解决方案&#xff0c;与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题&#xff0c;基本上可以达到实时同步。而且节点与节点之间&#xff0c;他们相互的关系是对等的。PXC 最…