代码之家  ›  专栏  ›  技术社区  ›  Esteban Araya

如何在C中抑制对方法调用的错误?

  •  5
  • Esteban Araya  · 技术社区  · 15 年前

    我正在寻找一种“优雅”的方法来在调用方法时抑制异常。

    我认为下面的代码太冗长了:

    try
    { CallToMethodThatMayFail(3); }
    catch {}
    

    有没有一些句法上的甜言蜜语我可以用来说“我真的不在乎这个方法是否失败”?我想调用该方法并继续执行,不管该方法发生了什么。

    7 回复  |  直到 8 年前
        1
  •  10
  •   Marc Gravell    15 年前

    忽略/忽略错误很少是个好主意…

    为了允许重用,您所拥有的唯一选项类似于 Action :

     static void IgnoreErrors(Action action) {try {action();} catch {}}
    

    但到目前为止,你还没有节省多少钱:

    SomeHelper.IgnoreErrors(() => CallToMethodThatMayFail(3));
    

    我只想离开 try / catch 就位…


    回复评论中的问题:

    static void IgnoreErrors<T>(Action action) where T : Exception
    {
        try { action(); } catch (T) {}
    }
    
    SomeHelper.IgnoreErrors<ParseException>(() => CallToMethodThatMayFail(3));
    

    但我还是会发现 尝试 / 抓住 局部地…

        2
  •  5
  •   nos    15 年前

    不,就是这个。

    很好,它很冗长。如果你要压制一个可能的例外,你最好有一个很好的理由。冗长的内容将帮助您或在几个月后查看代码的下一个人。

        3
  •  4
  •   Jeremy Frey    15 年前

    使用Castle,您可以这样做:

    public class ExceptionSuppressionInterceptor : Castle.Core.Interceptor.IInterceptor
    {
       public void Intercept(IInvocation invocation)
       {
           try {
               invocation.Proceed();
           }
           catch (Exception ex) {
                // Suppressed!
           }
       }
    }
    

    并修饰要禁止异常的类,如下所示:

    [Interceptor(typeof(ExceptionSuppressionInterceptor))]
    public class GoodPracticeBreaker {
    
    }
    

    但你真的不应该。

        4
  •  1
  •   Larsenal    15 年前

    我不知道还有什么更简洁的。我想你可以做一些AOP或者类似的东西来做一些更花哨的事情。

        5
  •  1
  •   HasaniH    15 年前

    .NET约定是类实现一个TrycallmayFail()方法和一个CallmayFail()方法,调用方选择要使用的方法,但TrycallmayFail()方法将完全包含您在其中的内容。

        6
  •  0
  •   John Saunders    15 年前

    不,没有更好的方法可以做到这一点,这是一个很好的理由。您看到的异常可能不仅仅意味着“方法失败”。这可能意味着“系统正在崩溃”。

    你可能至少应该记录下失败的事实,以防它最终被证明是重要的。

        7
  •  0
  •   user6535    15 年前

    你为什么说这太冗长了?如果您试图保存击键,可以只使用代码段。如果您关心可读性,那么我认为AOP方法对于另一个维护人员来说(至少在最初)就不那么清楚了,而且对于我来说,这比冗长的多。