C#支持编译过滤器吗?过滤器是如何工作的或者它们做什么呢?
就像反编译器将一个过滤器反编译为:
try { } catch(Exception e) when (?) { }
C#支持编译过滤器吗?过滤器是如何工作的或者它们做什么呢?
就像反编译器将一个过滤器反编译为:
try { } catch(Exception e) when (?) { }
自 C# 6 起,您现在可以这样做。
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
使用异常过滤器与在catch
块内部使用if
语句不同,使用异常过滤器不会展开堆栈。
直到C# 6,C#不支持像VB一样的异常过滤器。关于它们的工作原理,请参见Eric Lippert的“Finally” Does Not Mean “Immediately”
从C# 6开始,支持异常过滤器,如C# FAQ所示:
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
private static bool Log(Exception e) { /* log it */ ; return false; }
…
try { … }
catch (Exception e) when (Log(e)) {}
感谢Mafii提供的C# 6文档链接。
C# 6(Visual Studio“Dev14”)引入了C#中的异常过滤器支持:
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
}
if
已被替换为when
。 - Mafii在捕获异常时,如果您想以不同的方式处理异常,则可以使用异常过滤器
-- 在C# 6.0之后
-- 在VB 7.1之后使用WHEN
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# 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!");
}
}
由于这段代码等同于之前的代码。这意味着它们是等价的,对吗?--- "但不,它们并不等价"
注意:异常过滤器不会解开堆栈
从这里了解更多信息。