zoukankan      html  css  js  c++  java
  • .NET异常处理的动作策略(Action Policy)

         SQL Server 2008基于策略的管理,基于策略的管理(Policy Based Management),使DBA们可以制定管理策略,并将这些策略应用到服务器、数据库以及数据环境中的其他对象上去。基于动作策略(Action Policy)的异常处理使开发人员可以为异常处理制定策略,简单的说,动作策略只是一些可重复使用的一个装饰器,可以很容易应用与方法调用。

         异常处理只是一个合乎逻辑的动作策略的一部分,动作策略决定如何对异常做出处理,微软的Enterprise Library的异常处理模块试图为开发人员和policy制定者为整个企业级应用程序各层的异常处理创建一致的策略。但是,异常处理的策略是硬编码的(也就是简单的try-catch代码块)。

         如下是简单的示例代码:

     1 try
     2 {
     3     customersDataSet = RunQuery(“GetAllCustomers”);
     4 }
     5 catch(Exception ex)
     6 {
     7     bool rethrow = ExceptionPolicy.HandleException(ex, “Data Access Policy”);
     8     if (rethrow)
     9     throw;
    10 }

         红色部分的Exception Policy是硬编码的,这里我给你介绍一种更好的基于动作策略(Action Policy)的异常处理,这个异常处理策略的的原理是充分利用C#的闭包Action<Action>,这个在园子里有很多讨论:

         Action<Action>其实就是一个委托:

         public delegate void Action();

         public delegate void ActionPolicy(Action action);

         很容易我们就可以实现一个出现异常情况下重试3次的策略

     1 void MyRetryPolicy(Action action)
     2 {
     3     int counter = 0;
     4     while (true)
     5     {
     6           try
     7         {
     8             action();
     9                 return;
    10         }
    11           catch (DbException ex)
    12         {
    13                 counter+=1;
    14                 if (counter==3)
    15             {
    16                     throw;
    17             }
    18                 Thread.Sleep(1);
    19         }
    20     }
    21 }

         这个策略可以这样用:

    1 // 没有参数和返回值的简单调用
    2 MyRetryPolicy(() => LongRunningDbCall());
    3 MyRetryPolicy(() => AnotherFragileCall());
    4 // 有一个参数和返回值的调用
    5 int result = 0;
    6 MyRetryPolicy(() => result = CreateRecords(records));

         上述代码包含了两部分的逻辑,异常处理和行动策略。这个代码不够通用,可以包装一个行动策略。下面介绍一下在我的项目中使用的行动策略,我使用Autofac模块包装了行动策略,代码如下:

     1 public class ActionPolicyModule : Module
     2 {
     3      protected override void Load(ContainerBuilder builder)
     4     {
     5         builder.Register(c => ComposeActionPolicy(c));
     6         base.Load(builder);
     7     }
     8 
     9      static ActionPolicy ComposeActionPolicy(IComponentContext context)
    10     {
    11         ILog log = context.Resolve<ILog>();
    12         var actionPolicy = ActionPolicy.With(e => CompositeExceptionHandler(e, log))
    13            .Retry(3, (ex,i) =>
    14            {   
    15                log.DebugFormat(ex, "Retrying exception for the {0} time", i);
    16                SystemUtil.Sleep((0.5 + i).Seconds()); 
    17            });
    18           return actionPolicy;
    19     }
    20 
    21      static bool CompositeExceptionHandler(Exception ex, ILog log)
    22     {
    23         ExceptionCounters.Default.Add(ex);
    24 
    25           if (ex.Message.Contains("Password"))
    26         {
    27                 throw new SecuredException(ex);
    28         }
    29           if (ex is DbException)
    30         {
    31                 return true;
    32         }
    33           log.Error(ex, "Unrecoverable exception");
    34           return false;
    35     }
    36 }

         我们的方法中对策略的调用的代码很简单:

    1 public void AddAppliction(Application appInfo)
    2 {
    3     _scopes.Validate(appInfo, "AppInfo", AppRules.Appliction);
    4     _log.DebugFormat("AddAppliction()");
    5     _policy.Do( () => appRepository.AddAppliction(appInfo));
    6 }

         _policy就是一个ActionPolicy对象,来自于Autofac内的策略配置,这样我们就可以在我们的代码中去除类似于微软的Enterprise Library的异常处理模块的硬编码代码。细心的你注意到了红色的代码中使用一个Retry Action Policy,出错的时候重试三次,每次之间间隔时间依次加长,重试了三次都不成功才抛出异常,这是一个很有用的功能,比如在数据库发生死锁的时候。动作策略还支持一种断路器,我们的生活中有一种很常见的电路断路器,在发生电涌或过载的时候保护我们的电路,我们的分布式系统中也会碰到类似的现象。

    参考链接:http://www.cnblogs.com/shanyou/archive/2010/05/30/1747613.html

  • 相关阅读:
    scrapy 命令行传参 以及发送post请求payload参数
    scrapy框架+selenium的使用
    python 制作GUI页面以及多选框、单选框
    上线操作
    在Linux中使用selenium(环境部署)
    解读Java NIO Buffer
    Maven自定义Archetype
    解决spark streaming集成kafka时只能读topic的其中一个分区数据的问题
    在windows下使用pip安装python包遇到缺失stdint.h文件的错误
    maven-shade-plugin插件未生效原因分析
  • 原文地址:https://www.cnblogs.com/supersnowyao/p/8452940.html
Copyright © 2011-2022 走看看