C# - 使用谓词表达式尝试/捕获

jen*_*nsa 22 .net c# exception

以下是从MSDN,try-catch(C#参考)中获取的示例

catch (ArgumentException e) if (e.ParamName == "…")
{
}
Run Code Online (Sandbox Code Playgroud)

他们也说

使用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)
    {
        // ....
    }
}
Run Code Online (Sandbox Code Playgroud)

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

error CS1003: Syntax error, 'when' expected
Run Code Online (Sandbox Code Playgroud)

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

error CS1003: Syntax error, 'when' expected
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

谢谢.

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

Jak*_*rtz 22

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