【问题标题】:Eliminating repetitive try/catch code消除重复的 try/catch 代码
【发布时间】:2011-07-15 23:25:43
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 我发现自己很少使用 try/catch。它们通常由全局异常处理程序处理,无论是 ASP.NET、WCF 等。您在哪里/何时发现自己捕获异常?

标签: c# aop


【解决方案1】:

我建议编写将委托(例如 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;
       }
    }
 }

【讨论】:

  • 我明白你的意思。在委托块中,我可以放 try/catch?
  • 不,您将在处理异常的方法中使用 try/catch 块,在本例中为 OverflowHandler。该方法的 try 块将调用传递给该方法的委托。
  • 我已经编辑了我的答案以说明异常处理程序方法并更好地表明您没有在委托块中放置 try/catch 块。
【解决方案2】:

以下是 MS 实践和模式 团队提供的内容。

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

他们肯定有 rethrow + 各种策略的概念。

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

【讨论】:

    【解决方案3】:

    听起来您确实在寻找 AOP 可以提供的功能。根据您的具体目标,您可能只需按照 Peter O. 的建议编写一些辅助方法,即可获得许多相同的好处而无需额外开销。

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

    【讨论】:

    • 我发现的问题是我的代码可以打开文件,但逻辑不同,需要捕获相同的异常,因此重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2014-12-18
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多