C#异常过滤器?
答
C#不支持异常过滤器如VB做,直到C#6,至于他们是如何工作的,请参阅埃里克利珀的"Finally" Does Not Mean "Immediately"
在C#6,异常启动过滤器的支持,为the C# FAQ demonstrates:
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
如果parenthesi如果'if'[现在的
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
}
答
后
虽然捕获异常,如果你想以不同的方式处理异常,那么你可以使用异常过滤器
- 当使用
1)C#样品后C#6.0
后
try
{
throw new CustomException { Severity = 100 };
}
catch (CustomException ex) when (ex.Severity > 50)
{
Console.WriteLine("*BING BING* WARNING *BING BING*");
}
catch (CustomException ex)
{
Console.WriteLine("Whooops!");
}
注:请记住,顺序事项
2)C#示例之前C#6.0
try
{
throw new CustomException { Severity = 100 };
}
catch (CustomException ex)
{
if (ex.Severity > 50)
{
Console.WriteLine("*BING BING* WARNING *BING BING*");
}
else
{
Console.WriteLine("Whooops!");
}
}
由于这段代码等同于前一个。意味着它们是等价的,对吗?---“但是不,他们是不等价的”
注:在异常过滤器不会展开堆栈
阅读更从Here
您可以添加你想要一个更好的定义或示例过滤器:) – 2010-11-24 15:09:23
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf,#23.3:如何处理异常 – 2010-11-24 15:12:33
另请参阅:http://*.com/questions/181188/c-equivalent-to-vb-net-catch-when – 2010-11-24 15:16:44