惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Dorian Deng

IE9 支持的是 H.264 视频标准,不是苹果 Safari 深入 Unity 1.x 依赖注入容器之四:依赖注入 深入 Unity 1.x 依赖注入容器之三:获取对象 深入 Unity 1.x 依赖注入容器之二:初始化 Unity 深入 Unity 1.x 依赖注入容器之一:入门 Unity 1.0 中文文档:1 - Unity 简介 Unity Feb 26 Weekly Drop 使用 Unity Application Block(三):理解和使用依赖注入的键 使用 Unity(二):配置 Unity 、读取配置信息和获取对象 使用 Unity(一):Unity 应用程序块容器介绍 EntLib 4.0 和 Unity 的开发团队 [译]EntLib V4 产品需求总表(Product Backlog)(更新:2008-1-14) 简单是一种美:提高项目成功率的一些方法 Enterprise Library 异常处理应用程序块关键场景 Enterprise Library 异常处理应用程序块开发任务的细节 使用 Enterprise Library 异常处理应用程序块开发 Enterprise Library 异常处理应用程序块简介 Enterprise Library 数据访问应用程序块快速入门 Enterprise Library 数据访问应用程序块的部署和操作
Enterprise Library 异常处理应用程序块的设计
Dorian Deng · 2007-12-13 · via 博客园 - Dorian Deng

本文档维护在:http://wiki.entlib.net.cn/EntlibHelp31ExceptionHandlingApplicationBlock.ashx

异常处理应用程序块为达到下列目标而设计:

  • 封装用于完成最常见的异常处理任务的逻辑到最少的应用程序代码。
  • 解放需要缩写用于常见异常处理任务的重复代码和定制代码的开发人员。
  • 允许在部署后更改异常处理策略,并确保修改同时且一致的发生。
  • 加入异常处理的最佳实践,就像在 Exception Management Architecture Guide 中描述的一样。

设计亮点

图 1 展示了异常处理应用程序块关键类之间的内部关系。

图片

图 1 异常处理应用程序块的设计

客户代码通过静态方法 HandleException 与异常处理应用程序块相互作用。此方法在 ExceptionPolicy 类中。HandleException 方法使用一个工厂为命名策略创建一个 ExceptionPolicyImpl 类型的对象。ExceptionPolicyImpl 对象有一个 ExceptionPolicyEntry 对象的集合。这是用于命名策略指定在配置文件中的每个异常类型的对象。对于每个异常类型,ExceptionPolicyEntry 对象包含了实现了 IExceptionHandler 接口的对象的列表。列表是有序的,并且提供了异常处理应用程序块在执行策略时使用的队列。实现了 IExceptionHandler 接口的每个对象与指定给每个处理程序类型的配置信息关联。

5.1 - 用于简化 catch 块的设计

常见的异常处理行为,如记录和替换异常以隐藏敏感信息,通常需要多行代码。更改异常处理行为以应用异常处理策略的改变经常涉及多个文件和代码行。此过程很容易出错,而很难保证策略在应用程序的所有层中被一致的更新。

异 常处理应用程序块简化了异常处理代码和更新代码的过程。它通过关联异常处理行为和策略的名称如“Data Access Layer Policy”和“Trust Boundary Policy”来做到这一点。行为由可被外部控制的策略名称所表示,在应用程序的配置文件中。这意味着开发人员仅需要使用二个元素来编写在应用程序的 catch 块中的代码:

  • 调用传递策略名称和异常的静态 HandleException 方法。
  • 检查从 HandleException 方法中返回的代码。如果是 true ,原始异常将被重新抛出。

设计内涵

封装异常处理逻辑到依赖于关于异常处理应用程序块的设计的二点的单一方法调用:

  • 必须是支持策略名称的 API。
  • 依赖于 Enterprise Library 内核。

下面的节描述了这些内涵。

用于策略名称的 API 支持

HandleException 方法接受包含策略名称的字符串和异常对象做为输入。ExceptionPolicyFactory 对象使用这个策略名称定位在应用程序配置文件中的适当的异常策略信息,如要运行的异常处理程序。

在代码中使用的策略名称必须与在配置文件中找到的策略名称匹配。代替要求开发人员首先为不同的异常类型创建不同的策略,然后基于异常类型调用正确的策略,开发人员可以为不同的异常类型配置策略以有不同的行为。要支持此特性,HandleException 方法还接受原始异常对象做为输入。

通常,应用程序必须通过执行一条 throw 语句传播异常给调用者。如果异常处理应用程序块使用了 throw 语句,堆栈跟踪将指出异常发生在应用程序块中而不是在应用程序代码中。要允许捕获的堆栈跟踪信息以反映在应用程序中传播发生的点,HandleException 方法返回一个 Boolean 值。这指出用于异常类型的策略是否决定将发生传播。检查返回值是应用程序代码的责任,如果是 true ,抛出原始异常。下面的代码展示了如何来做这一点。

C#

bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Layer Policy");
if (rethrow)
{
throw;
}

Visual Basic

Dim rethrow As Boolean = ExceptionPolicy.HandleException(ex, "Data Access Layer Policy")
If (rethrow) Then
Throw
End If

依赖 Enterprise Library 内核

策略被外部的定义在用于应用程序的配置文件中。异 常处理应用程序块依赖于用于创建策略对象的工厂设计模式。配置数据决定了对象的类型和属性。工厂类使用在 Enterprise Library 内核中的配置 helper 类基于配置数据构造对象实例。更多信息,请参见 Enterprise Library 内核。

5.2 - 用于在可重用的处理程序中行为封装的设计

异常处理应用程序块让开发人员创建表示常见异常处理任务的异常处理程序。这些处理程序,以及处理程序的组合,可以被用于不同的策略。

设计内涵

封装异常处理行为到可重用的处理程序中依赖于关于应用程序块的设计的二点:

  • 必须是一个处理程序实现的通用接口。
  • 策略必须可以是支持有序的处理程序组合。

下面的节描述了这些内涵。

通用接口

应用程序组件使用策略名称和异常来指出异常处理应用程序块要执行的行为。应用程序块通过执行为策略配置的异常处理程序来提供此行为。要让应用程序块正确的执行处理程序,所有处理程序必须实现 IExceptionHandler 接口。由应用程序块提供的三个处理程序全部都支持此接口,但开发人员也可以容易的编写符合同样的接口的定制处理程序。

用于有序异常处理程序组合的策略支持

异常处理程序可以在策略间重用,因为它们通常解决单一任务。他们可以被组合在一个异常策略中以解决更复杂的任务。策略按顺序执行配置的处理程序。