.NET异常处理的动作策略(Action Policy)
SQL Server 2008基于策略的管理,基于策略的管理(Policy Based Management),使DBA们可以制定管理策略,并将这些策略应用到服务器、数据库以及数据环境中的其他对象上去。基于动作策略(Action Policy)的异常处理使开发人员可以为异常处理制定策略,简单的说,动作策略只是一些可重复使用的一个装饰器,可以很容易应用与方法调用。
异常处理只是一个合乎逻辑的动作策略的一部分,动作策略决定如何对异常做出处理,微软的Enterprise Library的异常处理模块试图为开发人员和policy制定者为整个企业级应用程序各层的异常处理创建一致的策略。但是,异常处理的策略是硬编码的(也就是简单的try-catch代码块)。
如下是简单的示例代码:
try
{
customersDataSet = RunQuery(“GetAllCustomers”);
}
catch(Exception ex)
{
bool rethrow = ExceptionPolicy.HandleException(ex, “Data Access Policy”);
if (rethrow)
throw;
}
红色部分的Exception Policy是硬编码的,这里我给你介绍一种更好的基于动作策略(Action Policy)的异常处理,这个异常处理策略的的原理是充分利用C#的闭包Action<Action>,这个在园子里有很多讨论:
Action<Action>其实就是一个委托:
public delegate void Action();
public delegate void ActionPolicy(Action action);
很容易我们就可以实现一个出现异常情况下重试3次的策略
void MyRetryPolicy(Action action)
{
int counter = ;
while (true)
{
try
{
action();
return;
}
catch (DbException ex)
{
counter+=;
if (counter==)
{
throw;
}
Thread.Sleep();
}
}
}
这个策略可以这样用:
// 没有参数和返回值的简单调用
MyRetryPolicy(() => LongRunningDbCall());
MyRetryPolicy(() => AnotherFragileCall());
// 有一个参数和返回值的调用
int result = ;
MyRetryPolicy(() => result = CreateRecords(records));
上述代码包含了两部分的逻辑,异常处理和行动策略。这个代码不够通用,可以包装一个行动策略。下面介绍一下在我的项目中使用的行动策略,我使用Autofac模块包装了行动策略,代码如下:
public class ActionPolicyModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(c => ComposeActionPolicy(c));
base.Load(builder);
} static ActionPolicy ComposeActionPolicy(IComponentContext context)
{
ILog log = context.Resolve<ILog>();
var actionPolicy = ActionPolicy.With(e => CompositeExceptionHandler(e, log))
.Retry(, (ex,i) =>
{
log.DebugFormat(ex, "Retrying exception for the {0} time", i);
SystemUtil.Sleep((0.5 + i).Seconds());
});
return actionPolicy;
} static bool CompositeExceptionHandler(Exception ex, ILog log)
{
ExceptionCounters.Default.Add(ex); if (ex.Message.Contains("Password"))
{
throw new SecuredException(ex);
}
if (ex is DbException)
{
return true;
}
log.Error(ex, "Unrecoverable exception");
return false;
}
}
我们的方法中对策略的调用的代码很简单:
public void AddAppliction(Application appInfo)
{
_scopes.Validate(appInfo, "AppInfo", AppRules.Appliction);
_log.DebugFormat("AddAppliction()");
_policy.Do( () => appRepository.AddAppliction(appInfo));
}
_policy就是一个ActionPolicy对象,来自于Autofac内的策略配置,这样我们就可以在我们的代码中去除类似于微软的Enterprise Library的异常处理模块的硬编码代码。细心的你注意到了红色的代码中使用一个Retry Action Policy,出错的时候重试三次,每次之间间隔时间依次加长,重试了三次都不成功才抛出异常,这是一个很有用的功能,比如在数据库发生死锁的时候。动作策略还支持一种断路器,我们的生活中有一种很常见的电路断路器,在发生电涌或过载的时候保护我们的电路,我们的分布式系统中也会碰到类似的现象。
参考链接:http://www.cnblogs.com/shanyou/archive/2010/05/30/1747613.html
.NET异常处理的动作策略(Action Policy)的更多相关文章
- 强化学习(十三) 策略梯度(Policy Gradient)
在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习.这种Value Based强化学习方法在很多领域都得到比较好的应用,但是Value Based强化学习方法也有很 ...
- 路由策略Routing Policy和策略路由PBR的区别
这是面试的时候问道的一个问题,这里跟大家分享一下 路由策略(Routing Policy)是为了改变网络流量所经过的途径而修改路由信息的技术: PBR(policy-based-route)是一种依据 ...
- Rman备份的保留策略(retention policy)
什么是备份的保留策略(retention policy) 保留策略就是指某份备份是否要保留以及保留多久.可以使用configure retention policy命令来创建一个一致的.自动的备份保留 ...
- XAF 框架中,自定义参数动作(Action),输入参数的控件可定义,用于选择组织及项目
XAF 框架中,如何生成一个自定义参数动作(Action),输入参数的控件可定义? 参考文档:https://documentation.devexpress.com/eXpressAppFramew ...
- [js]浏览器同源策略(same-origin policy)
浏览器的同源策略 浏览器同源政策及其规避方法 什么是同源策略 A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源".所谓"同源"指的是" ...
- 1.4 配置备份策略(Policy)
1.1 配置备份策略(Policy) 一个备份策略由四部分组成. Attributes(属性) Policy是否Active Policy类型 由此Policy产生的任务的优先级 使用的Storage ...
- 1.4 NBU配置备份策略(Policy)
1.4 配置备份策略(Policy) 一个备份策略由四部分组成. Attributes(属性) Policy是否Active Policy类型 由此Policy产生的任务的优先级 使用的Storage ...
- 同源策略Same-origin policy
同源策略Same-origin policy 同源策略Same-origin policy是Web应用的一种安全基础策略.它规定同一源中,页面包含的脚本可以访问该源下的其他页面的数据.只有当网址中的 ...
- JSP——JavaServer Page中的隐式对象(implicit object)、指令(directive)、脚本元素(scripting element)、动作(action)、EL表达式
目录 1.JSP概述 2.注释(comment) 2.1.JSP注释 2.2.HTML注释 3.隐式对象(implicit object) 3.1.隐式对象清单 3.2.request对象 3.3.o ...
随机推荐
- Trie-648. Replace Words
In English, we have a concept called root, which can be followed by some other words to form another ...
- 记录php漏洞--宇宙最强语言 PHP 爆出 DoS 漏洞,可以直接灌满 CPU
站长之家(Chinaz.com)5月20日消息 近日,PHP被爆出存在远程DOS漏洞,若黑客利用该漏洞构造PoC发起连接,容易导致目标主机CPU被迅速消耗.此漏洞涉及众多PHP版本,因而影响范围极大 ...
- ReentrantLock总体概括
一.锁的实现原理: JAVA concurrent包下面的锁是通过AbstractQueuedSynchronizer内的Node类下面的state属性来实现的,并且锁的可重入属性也是通过state实 ...
- Vue环境搭建及node安装过程整理
一.nodejs的安装 Node.js安装包及源码下载地址为:https://nodejs.org/en/download/. 我们可以根据不同平台系统选择你需要的Node.js安装包.Node.js ...
- 【xsy1162】鬼计之夜 最短路+二进制拆分
套路题(然而我没看题解做不出来) 题目大意:给你一个$n$个点,$m$条有向边的图.图中有$k$个标记点,求距离最近的标记点间距离. 数据范围:$n,m,k≤10^5$. 设$p_i表$示第$i$个标 ...
- eclipseGUI的可视化开发工具插件
一 各种GUI开发插件的特色 Eclipse并不自带GUI的可视化开发工具,那么如果要在Eclipse进行可视化的GUI开发,就需要依靠第三方的插件. 1. Visual Editor Eclip ...
- 转:android studio 一直卡在Gradle:Build Running的解决办法
在使用AS开发安卓应用程序的时候经常会遇到Gradle build running一直在运行甚至卡死的情况,解决方法如下: 方法1: 1.在C:\User\<用户名>\.gradle 目录 ...
- C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)
C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇) 名词解释:apxs apxs is a tool for building and installing ext ...
- (转) mysql之status和variables区别及用法详解
原文:http://blog.csdn.net/andyzhaojianhui/article/details/50052117
- [转]Elasticsearch Java API总汇
http://blog.csdn.net/changong28/article/details/38445805#comments 3.1 集群的连接 3.1.1 作为Elasticsearch节点 ...