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不会展开堆栈
从这里读更多