C#异常过滤器?

问题描述:

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

像反射反编译一个过滤器

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

您可以添加你想要一个更好的定义或示例过滤器:) – 2010-11-24 15:09:23

+0

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf,#23.3:如何处理异常 – 2010-11-24 15:12:33

+2

另请参阅:http://*.com/questions/181188/c-equivalent-to-vb-net-catch-when – 2010-11-24 15:16:44

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

后VB 7.1 - 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