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

  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/supersnowyao/p/8452940.html
Copyright © 2011-2022 走看看