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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
一.概述
使开发人员和决策人员能够针对发生在企业应用程序体系结构层的异常处理创建一致的策略。它的实现方法如下:
1)它支持整个应用程序体系结构层的异常处理,而不仅限于服务接口的界限。
2)它使得异常处理策略可以在管理层定义和维护,以便决策人员(可能是系统管理员和开发人员)可以定义如何处理异常。他们可以维护和修改控制异常处理的规则集,而无需更改块的应用程序代码。
3)它提供了常用的异常处理功能,例如记录异常信息的功能、通过将原始异常替换为其他异常来隐藏敏感信息的功能,以及通过将原始异常打包到另一个异常中来添加异常的上下文信息的功能。这些功能封装在名为 Exception handlers  .NET 类中。
4)它可以合并多个异常处理程序以产生某个异常所需的响应,例如先记录异常信息,再将原始异常替换为其他异常。
5)它使开发人员能够创建自己的异常处理程序。
6)它以一致的方式调用异常处理程序。这意味着,处理程序可以在应用程序之中和之间的多种场合下使用。
常见情况
异常处理应用程序块被设计为支持包含在应用程序组件的 catch 语句中的典型代码。该应用程序块允许开发人员将此逻辑封装为可重用的异常处理程序,而不是在应用程序组件的相同 catch 块中重复这段代码(例如,记录异常信息)。异常处理程序是封装异常处理逻辑和实现名为 IExceptionHandler 的异常处理应用程序块接口的 .NET 类。异常处理应用程序块包含三个异常处理程序:
包装处理程序: 此异常处理程序可将一个异常包装到另一个异常中。
替换处理程序: 此异常处理程序可将一个异常替换为另一个异常。
日志处理程序: 此异常处理程序可格式化异常信息,例如消息和堆栈跟踪等。然后,日志处理程序将该信息提供给企业程序库日志和规范应用程序块,以便可以将它发布。
异常处理应用程序块可让您将异常类型与指定的策略相关联。您可以使用配置控制台来完成此项工作。策略可指定在应用程序块处理特定异常类型时执行的异常处理程序。您可以将这些处理程序串联起来,这样,在处理关联的异常类型时就可以执行一系列处理程序
二.几个重要的概念
1 .策略:
确定一系列的异常类型是如何拦截并处理的
每一个策略可以包含多个异常类型
每个应用程序支持多个异常策略
2 .异常类型:
可以使用 Exception 功能的异常类型应该是一个 System.Exception 类型或从此类继承下来的类
每一个异常类型可以包含一个或多个 Handler
每一个异常均可以通过映射到 .NET 中的特定类型,从而被处理
3 .处理器:
异常捕获后进行处理的方式有日志,包装,替换等;
每一个异常类型可以有多个异常处理器;
每一个异常捕获处理器均有机会修改原有异常;
每一个异常捕获处理器均有机会将自己的信息通过异常传递给下一个异常处理程序;
三.编写示例程序:
1 .在开始进行配置之前,我们先编写一个异常包装的类。
 1 using  System;
 2 using  System.Runtime.Serialization;
 3
 4 namespace  EnterpriseExceptionHandler
 5 {
 6    /// <summary>
 7    /// 功能说明:创建一个包装异常的类,需要继承ApplicationException
 8    /// 程序作者:Terrylee
 9    /// 编写日期:2005年11月13日
10    /// </summary>

11    public class ExceptionHelper:ApplicationException
12    {
13        /// <summary>
14        /// 默认的构造函数
15        /// </summary>

16        public ExceptionHelper() : base() 
17        {
18
19        }

20
21        /// <summary>
22        /// 序列化错误信息
23        /// </summary>
24        /// <param name="message">错误信息</param>

25        public ExceptionHelper(string message) : base(message) 
26        {
27
28        }

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

35        public ExceptionHelper(string message, Exception exception) : base(message, exception) 
36        {
37
38        }

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

45        protected ExceptionHelper(SerializationInfo info, StreamingContext context) :base(info, context) 
46        {
47
48        }

49    }

50}

51
2 .打开配置工具,创建一个异常应用程序块。
 
3 .创建一个策略。
 
4 .命名为 Wrap Policy
 
5 .创建一个异常类型 Exception
 
6 .创建一个异常处理器,命名为 Wrap Handler ,选择它的 WrapExceptionTypeName 为我们刚才创建的那个异常包装类。
 
7 .同样,再创建一个替换策略和日志策略,分别命名为 Replace Policy Log Policy ,注意 Log Policy 依赖于日志和监测应用程序块。
8 .拷贝目录(我每次都说,大家可能会觉着烦 ^_^ ,不过我自己总是忘了这一条,所以不得不每次提醒大家)。
copy  " $(ProjectDir)\*.config "   " $(TargetDir) "   >  Nul
9 .在程序中编写代码(代码编写很简单)。
 1 /// <summary>
 2        /// 包装策略
 3        /// </summary>
 4        /// <param name="sender"></param>
 5        /// <param name="e"></param>

 6          private   void  btn_Wrap_Click( object  sender, System.EventArgs e)
 7          {
 8            try
 9            {
10                Exception ex = new Exception();
11                throw ex;
12            }

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

21            }

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

31            }

32        }

33         
34          /// <summary>
35        /// 替换策略
36        /// </summary>
37        /// <param name="sender"></param>
38        /// <param name="e"></param>

39          private   void  btn_Replace_Click( object  sender, System.EventArgs e)
40          {
41            try
42            {
43                Exception ex = new Exception();
44                throw ex;
45            }

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

54            }

55        }

56         
57          /// <summary>
58        /// 日志策略
59        /// </summary>
60        /// <param name="sender"></param>
61        /// <param name="e"></param>

62          private   void  btn_Log_Click( object  sender, System.EventArgs e)
63          {
64            try
65            {
66                Exception ex = new Exception();
67                throw ex;
68            }

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

77            }

78        }
10 .执行程序,单击日志策略。在事件查看器中查看相应的日志记录。
结束语:异常处理应用程序块相对于其他应用程序块来说是比较简单的,入门篇里就介绍这么多了 J














本文转自lihuijun51CTO博客,原文链接:  http://blog.51cto.com/terrylee/67613 ,如需转载请自行联系原作者

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
8月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:输入与输出:Scanner与System类
你是否也经历过这些崩溃瞬间?三天教程连`i++`和`++i`都说不清,面试时`a==b`与`equals()`区别大脑空白,代码总是莫名报NPE。这个系列就是为你打造的Java「速效救心丸」!每天1分钟,地铁通勤、午休间隙即可学习。直击高频考点和实际开发中的“坑位”,拒绝冗长概念,每篇都有可运行代码示例。涵盖输入输出基础、猜数字游戏、企业编码规范、性能优化技巧、隐藏技能等。助你快速掌握Java核心知识,提升编程能力。点赞、收藏、转发,助力更多小伙伴一起成长!
142 19
|
监控 前端开发 UED
在 React 18 中利用并发渲染提高应用性能
【10月更文挑战第12天】利用并发渲染需要综合考虑应用的特点和需求,合理运用相关特性和策略,不断进行优化和调整,以达到最佳的性能提升效果。同时,要密切关注 React 的发展和更新,以便及时利用新的技术和方法来进一步优化应用性能。你还可以结合具体的项目实践来深入理解和掌握这些方法,让应用在 React 18 的并发渲染机制下发挥出更好的性能优势。
256 59
|
Java
jvm复习,深入理解java虚拟机一:运行时数据区域
这篇文章深入探讨了Java虚拟机的运行时数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、元空间和运行时常量池,并讨论了它们的作用、特点以及与垃圾回收的关系。
194 19
jvm复习,深入理解java虚拟机一:运行时数据区域
|
12月前
|
XML 安全 Java
SpringBoot入门 - SpringBoot简介
▶SpringBoot入门 - SpringBoot简介
|
数据采集
正则表达式匹配html标签,获取标签内容
正则表达式匹配html标签,获取标签内容
|
运维 监控 安全
计算巢,软件上云最佳实践
2023云栖大会“计算巢专场”精华集锦
vscode彻底删除安装过的插件和个人配置信息
vscode彻底删除安装过的插件和个人配置信息
2225 0
vscode彻底删除安装过的插件和个人配置信息
Wi-Fi 7时代来临,速度飙升三倍!揭秘背后的黑科技,你准备好了吗?
【8月更文挑战第23天】Wi-Fi 7作为下一代无线网络技术,在速度、容量与延迟方面相比Wi-Fi 6有显著提升。其关键改进包括:采用4096-QAM调制技术实现高达30Gbps的数据传输速率;支持320MHz带宽以增强频谱利用;引入多链路操作(MLO)技术提升网络速度与稳定性;以及采用先进干扰侦测和避免技术改善抗干扰能力。随着Wi-Fi 7的发展与应用,未来的无线网络体验将更加卓越。
335 1
|
应用服务中间件 Docker 容器
Docker从入门到精通——Commit提交一个自己的镜像
Docker从入门到精通——Commit提交一个自己的镜像
1771 3
Docker从入门到精通——Commit提交一个自己的镜像
|
机器学习/深度学习 存储 编解码
NeRF系列(1):NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 论文解读与公式推导(一)
NeRF系列(1):NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 论文解读与公式推导
516 0