消除重复的try/catch代码

本文关键字:catch 代码 try | 更新日期: 2023-09-27 18:02:09

编写必须一次又一次处理相同异常的代码会让人感到无聊。

是否有一种方法来编写代码,没有try/catch,并添加属性到方法来捕获(和处理)可能发生的各种异常?这听起来像AOP (Postsharp),这是理想的解决方案吗?

所以我想写类,可以规定在哪里/如何记录异常,重新抛出等,他们从属性和任何基类/接口派生。然后重用它们并将它们应用于整个代码中的不同方法。这将大大提高一致性。

谢谢

消除重复的try/catch代码

我建议编写以委托(如Func和Action)作为参数的方法。代表们将代表"尝试"阵营。各个方法将以不同的方式处理委托中发生的异常。

的例子:

 OverflowHandler(delegate(){ checked{ x+=200; } });

overflowwhandler方法将处理OverflowException,并可能记录和重新抛出其他异常。

下面是OverflowHandler方法的示例:

 public void OverflowHandler(Action func){
    try {
       func(); // call the delegate
    } catch(Exception e){
       if(e is OverflowException){
          // handle the overflow exception
       } else {
          // log exception and rethrow
          LogException(e);
          throw;
       }
    }
 }

这是来自MS实践和模式团队的一些东西。

异常处理应用程序块介绍http://msdn.microsoft.com/en-us/library/ff664698 (v = PandP.50) . aspx

显然他们有重新抛出+各种策略的概念。

要我推荐吗?不确定。我看了他们的实现,最后使用了他们的一些概念。我告诉自己我会回来的,但是我还没有机会。

听起来你确实在寻找AOP可以提供的功能。根据您的具体需求,您可以通过编写一些helper方法来获得许多相同的好处,而无需额外的开销,正如Peter O.建议的那样。

我个人没有发现我有很多重复的异常处理代码,因为异常是…嗯…例外。它们不应该是正常代码流的一部分,除非有一些非常具体的事情需要做,以响应特定类型的异常,否则最好的策略通常是根本不捕获它们,至少在它们逐渐上升到您想要记录它们的高级别之前。