C#异常过滤器?

C#是否支持编译过滤器? 过滤器如何工作,或者他们做了什么?

像反射器一样反编译一个过滤器

try
{
}
catch(Exception e) when (?)
{
}

在C#6之前,C#不支持像VB这样的异常过滤器。至于它们的工作原理,请参阅Eric Lippert的“Finally”并不意味着“立即”

从C#6开始,支持异常过滤器,正如C#FAQ所示:

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
}

如果在'if'[now when ]计算结果为true之后加了括号的表达式,catch块将被运行,否则异常会继续。

异常过滤器优于捕捉和重新抛出,因为它们不会受到伤害。 如果异常后来导致堆栈被转储,你可以看到它最初来自哪里,而不仅仅是最后一个被重新放置的地方。

对于副作用使用异常过滤器也是一种常见和可接受的“滥用”形式; 例如日志。 他们可以检查一个例外情况,而不会拦截其行程。 在这些情况下,过滤器通常会调用一个执行副作用的假返回辅助函数:

private static bool Log(Exception e) { /* log it */ ; return false; }
…
try { … }
catch (Exception e) when (Log(e)) {}

感谢Mafii链接到C#6文档。


从C#6开始,你现在可以做到这一点。

try { … }
catch (MyException e) when (myfilter(e))
{
    …
}

这与在catch块内使用if语句不同,使用异常过滤器不会展开堆栈。


C#中的异常过滤器支持在C#6(Visual Studio“Dev14”)中引入:

try
{
    throw new ApplicationException("1");
}
catch (ApplicationException ex) when (ex.Message == "2")
{
    // this one won't execute.
}
catch (ApplicationException ex) when (ex.Message == "1")
{
    // this one will execute
}
链接地址: http://www.djcxy.com/p/25861.html

上一篇: C# exception filter?

下一篇: How to handle 404 not found errors in Nokogiri