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?