【问题标题】:How do you suppress errors to a method call in C#?如何抑制 C# 中方法调用的错误?
【发布时间】:2009-06-30 20:43:22
【问题描述】:

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

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

try
{ CallToMethodThatMayFail(3); }
catch {}

是否有一些语法糖可以用来表达“我真的不在乎这个方法是否失败”?无论该方法发生什么,我都想调用该方法并继续执行。

【问题讨论】:

  • 听起来你想要讨厌的 VB,比如 C# 中的 On Error Resume Next 功能!
  • 我认为这可能是你能得到的最优雅的。传递给一个函数来处理错误可能会更令人困惑。我不会依赖错误处理来忽略错误。我建议测试您想要忽略的预期错误情况并在您的代码中处理它。引发异常在性能方面比条件语句更昂贵。
  • 我想向大家指出,当这是一个好主意时,有一些小众场景。就像今天一样,我不得不修改一些代码来读取动态创建的数据网格,该数据网格只是根据 SQL VIEW 中的行名创建列。有时视图会发生变化,这在代码中可以正常工作,这个视图也可以在其他地方使用。对于这个网页,我需要以某种方式命名的列,但如果将来有人更改 VIEW,我不希望代码中断。

标签: c# error-handling


【解决方案1】:

忽略/吞下错误很少是个好主意...

要允许重复使用,您唯一的选择是类似于采用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));

但我仍然会发现在本地使用 try/catch 会更清楚...

【讨论】:

  • 有没有一种方法可以让“IgnoreError”函数同时接受要调用的函数和要忽略的错误类型?这样您就不会忽略系统错误,但如果您正在遍历大量用户输入的数据,则可以忽略“解析错误”。
  • @Marc:你是对的;这样做很少是一个好主意。但是,如果您确实想这样做,最好的方法是什么?我很欣赏你实际上回答了这些问题。我不太欣赏不回答的人获得赞成票。
  • 如果我有很多常见的处理代码要在一些场景中运行,我可能会使用委托方法......但是在吞咽时?我可能只是使用 try { /* call method */ } catch (ExpectedException) {}
【解决方案2】:

不,就是这个。

而且它很冗长是件好事。如果您要抑制可能的异常,则最好有一个很好的理由。详细程度将帮助您或下一个在几个月内查看代码的人。

【讨论】:

  • 恕我直言:我可以决定是否有充分的理由抑制异常。您还假设这是其他人会实际查看的代码。
【解决方案3】:

使用 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】:

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

    【讨论】:

    • 是的,AOPish 也是我的想法。我只是不知道该怎么做。
    • (-1) “我不知道”并没有真正的帮助。 “假设你能做到”并不是一个真正的答案。
    【解决方案5】:

    .Net 约定是类实现 TryCallMayFail() 方法和 CallMayFail() 方法,调用者选择使用哪一个,但 TryCallMayFail() 方法将包含您所拥有的。

    【讨论】:

    • 不是所有的,只有少数人这样做,这是我已经习惯的风格
    【解决方案6】:

    不,没有更好的方法可以做到这一点,这是有充分理由的。您看到的异常可能不仅仅意味着“方法失败”。这可能意味着“系统出现故障”。

    您可能至少应该记录失败的事实,以防它毕竟很重要。

    【讨论】:

      【解决方案7】:

      为什么说这太冗长了?如果您想保存击键,您可以使用代码 sn-p。如果您担心可读性,那么我认为 AOP 方法对另一个维护者来说不太清楚(至少最初是这样),对我来说,这胜过冗长。

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 2017-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多