C# - 尝试/谓语表达赶上

问题描述:

以下是MSDN, try-catch (C# Reference)C# - 尝试/谓语表达赶上

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

采取了一个例子,他们也说

使用捕捉参数是一种方式来过滤要处理的异常。您还可以使用谓词表达式来进一步检查异常以决定是否处理它。如果谓词表达式返回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提交了反馈,指出文档中的错误。

+2

捕获过滤器逻辑仅作为VS2015的一部分提供。这是你使用的版本吗? – AWinkle

+2

据我记得,如果被替换'时'关键字尝试交换,如果到 – MajkeloDev

+0

我正在编译通过'开发人员命令提示符VS2015',所以是的。我有Visual Studio 2015社区。 – jensa

这是MSDN网站上的错误。如编译器所示,您应该使用when而不是if

+0

是否有语言规范可用于具有此功能的C#版本? – recursive

+0

谢谢,它工作!我想有人应该指出MSDN的家伙。 – jensa

+0

@recursive看起来最新版本的规范是C#5.0 –