C# 6有一个名为“异常过滤”的新特性。
语法如下:
catch (Win32Exception exception) when (exception.NativeErrorCode == 0x00042)
{
//Do something here
} 我不禁想知道,这对目前的方法有什么好处:
catch (Win32Exception exception)
{
if (exception.NativeErrorCode == 0x00042)
{
//Do something here
}
}过滤发生在卷曲括号之前是件大事吗?也许是关于履约还是担保?
发布于 2014-11-22 20:38:20
Eren Ers nmez已经提到了最重要的好处。
我只想补充一点,当异常被捕获时,它具有解除堆栈的效果。这意味着,如果您用throw;重新抛出异常,并且它没有在堆栈的较高位置捕获,调试器将突出显示throw,而不是异常最初抛出的位置,因此在抛出异常时看不到变量的状态。
另一方面,异常过滤器不会展开堆栈,因此如果未捕获异常,调试器将显示异常最初抛出的位置。
所以如果你有这个
try
{
DoSomethingThatThrows();
}
catch (Win32Exception exception)
{
if (exception.NativeErrorCode == 0x00042)
{
//Do something here
}
else
{
throw;
}
}当throw不是0x42时,调试器将在NativeErrorCode上停止。
但如果你有这个
try
{
DoSomethingThatThrows();
}
catch (Win32Exception exception) if (exception.NativeErrorCode == 0x00042)
{
//Do something here
}调试器将在DoSomethingThatThrows中停止(或者在它调用的方法中),让您更容易地看到导致错误的原因(同样,当NativeErrorCode不是0x42时)
发布于 2014-11-23 13:20:46
来自官方C#特征描述 (PDF下载链接,如在VS2015预览):
异常筛选器比捕获和重新抛出更好,因为它们不会损害堆栈。如果异常稍后导致堆栈被转储,那么您可以看到它最初的来源,而不仅仅是它被重新抛出的最后一个位置。 使用异常过滤器进行副作用也是一种常见的和被接受的“滥用”形式,例如日志记录。他们可以在不拦截航向的情况下检查异常“飞过”。在这种情况下,过滤器通常是对执行副作用的假返回助手函数的调用: 私有静态bool (异常e) { /*日志*/;返回false;}…尝试{…} catch (异常e) if (Log(e)) {}
发布于 2014-11-22 20:27:11
它允许在不捕获异常的情况下检查条件,这意味着如果不满足条件,则考虑下一个catch块。如果你接住并重投,下一个接球块就不会被考虑.
https://stackoverflow.com/questions/27082069
复制相似问题