【问题标题】:C# - Try/Catch with predicate expressionC# - 使用谓词表达式尝试/捕获
【发布时间】:2016-02-22 02:58:27
【问题描述】:

以下是取自MSDN, try-catch (C# Reference)的例子

catch (ArgumentException e) if (e.ParamName == "…")
{
}

他们也说

使用 catch 参数是过滤要处理的异常的一种方法。您还可以使用谓词表达式进一步检查异常以决定是否处理它。如果谓词表达式返回 false,则继续搜索处理程序。

异常过滤器优于捕获和重新抛出(如下所述),因为过滤器不会损坏堆栈。如果稍后的处理程序转储堆栈,您可以看到异常最初来自哪里,而不仅仅是它被重新抛出的最后一个位置。异常过滤器表达式的一个常见用途是日志记录。您可以创建一个始终返回 false 并输出到日志的谓词函数,您可以在异常发生时记录它们,而无需处理它们并重新抛出。

我的代码:

static bool LogFunction(System.Exception ex)
{
    System.Console.WriteLine("Writing to logfile: {0}", ex.Message);
    return false;
}

static void Main(string[] args)
{
    try
    {
        throw new System.ArgumentException("The exception message...");
    }
    catch(System.Exception ex) if (LogFunction(ex))
    {
        System.Console.WriteLine("This will not be executed, ever!");
    }
    catch(System.ArgumentException ex)
    {
        // ....
    }
}

现在,编译器不会编译这个 (csc.exe),并给出以下错误消息:

error CS1003: Syntax error, 'when' expected

编辑:编译器为该行引发错误

error CS1003: Syntax error, 'when' expected

我做错了什么?

谢谢。

编辑:我向 MSDN 提交了反馈,指出了文档中的错误。

【问题讨论】:

  • 捕获过滤器逻辑仅作为 VS2015 的一部分提供。这是您使用的版本吗?
  • 据我记得这个 if 被替换为 'when' 关键字尝试交换 if to when
  • 你的if不应该换成when这个词吗?
  • 胜利的文档错误!
  • 嗯。错误也很明显;)

标签: c# .net exception


【解决方案1】:

这是 MSDN 网站上的错误。正如编译器建议的那样,您应该使用when 而不是if

【讨论】:

  • 是否有适用于具有此功能的 c# 版本的语言规范?
  • 谢谢,成功了!我想有人应该向 MSDN 的人指出这一点。
  • @recursive 最新版本的规范似乎适用于 C# 5.0
  • @recursive Jakub 是对的,5.0 是最后一个正式版本,6.0 的“规范”似乎以路线图、功能和票证的形式埋藏在 Roslyn 项目页面中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 2014-08-02
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多