消除重复的try / catch代码

时间:2011-07-15 23:25:44

标签: c# aop

编写必须一次又一次处理相同异常的代码总是很无聊。

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

所以我想编写可以指示异常记录,重新抛出等的位置/方式的类,它们派生自属性和任何基类/接口。然后重新使用它们并将它们应用于整个代码中的不同方法。这将大大提高一致性。

由于

3 个答案:

答案 0 :(得分:2)

以下是来自 MS Practices and Patterns 团队的内容。

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

肯定他们已经有了重新抛出+各种政策的概念。

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

答案 1 :(得分:2)

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

示例:

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

其中OverflowHandler方法将处理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;
       }
    }
 }

答案 2 :(得分:0)

听起来你正在寻找AOP可以提供的功能。根据您的具体目标,您可以通过编写一些辅助方法,而不需要额外的开销,就像Peter O.建议的那样,可以获得很多相同的好处。

我个人并没有发现我有很多重复的异常处理代码,因为Exceptions正好......非常好。它们不应该是正常代码流的一部分,除非有一些非常具体的东西需要响应特定类型的异常,所以最好的策略通常是不要捕获它们,至少在它们涓涓细流之前到你想要记录它们的高级别。