C#exceptionfilter?

C#是否支持编译filter? filter如何工作或他们做什么?

像reflection器一样reflection滤波器

 尝试
 {
 }
 catch(例外e)何时(?)
 {
 } 

在C#6之前,C#不支持VB之类的exceptionfilter。至于它们是如何工作的,请参阅Eric Lippert的“最后”并不意味着“立即”

从C#6开始,支持exceptionfilter,因为C#FAQ演示了 :

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

如果’if'[now when ]之后的括号表达式求值为true,则运行catch块,否则exception继续。

exceptionfilter比捕获和重新抛出更可取,因为它们可以保持堆栈不受破坏。 如果稍后的exception导致堆栈被转储,您可以看到它最初来自哪里,而不仅仅是它重新抛出的最后一个位置。

使用exceptionfilter进行副作用也是一种常见且被接受的“滥用”forms; 例如伐木。 他们可以在不拦截其路线的情况下检查“飞过”的exception。 在这些情况下,filter通常会调用一个错误返回的辅助函数来执行副作用:

 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语句不同,使用exceptionfilter不会展开堆栈。

C#中引入了exceptionfilter支持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 } 

捕获exception时,如果要以不同方式处理exception,则可以使用exceptionfilter
– 在C#6.0之后
– 在VB 7.1之后使用WHEN

1)C#6.0之后的C#示例

 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#6.0之前的C#示例

 try { throw new CustomException { Severity = 100 }; } catch (CustomException ex) { if (ex.Severity > 50) { Console.WriteLine("*BING BING* WARNING *BING BING*"); } else { Console.WriteLine("Whooops!"); } } 

由于这段代码相当于前一段代码。 意思是,它们是等价的,对吧? —“ 但不,他们不等同
注意:exceptionfilter不会展开堆栈

从这里读更多