首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新的“异常筛选”功能提供了什么好处?

新的“异常筛选”功能提供了什么好处?
EN

Stack Overflow用户
提问于 2014-11-22 20:19:16
回答 4查看 5.7K关注 0票数 33

C# 6有一个名为“异常过滤”的新特性。

语法如下:

代码语言:javascript
复制
catch (Win32Exception exception) when (exception.NativeErrorCode == 0x00042)  
{  
    //Do something here 
}  

我不禁想知道,这对目前的方法有什么好处:

代码语言:javascript
复制
catch (Win32Exception exception)   
{
     if (exception.NativeErrorCode == 0x00042)
     {
          //Do something here 
     }
}

过滤发生在卷曲括号之前是件大事吗?也许是关于履约还是担保?

EN

回答 4

Stack Overflow用户

发布于 2014-11-22 20:38:20

Eren Ers nmez已经提到了最重要的好处。

我只想补充一点,当异常被捕获时,它具有解除堆栈的效果。这意味着,如果您用throw;重新抛出异常,并且它没有在堆栈的较高位置捕获,调试器将突出显示throw,而不是异常最初抛出的位置,因此在抛出异常时看不到变量的状态。

另一方面,异常过滤器不会展开堆栈,因此如果未捕获异常,调试器将显示异常最初抛出的位置。

所以如果你有这个

代码语言:javascript
复制
try
{
    DoSomethingThatThrows();
}
catch (Win32Exception exception)   
{
     if (exception.NativeErrorCode == 0x00042)
     {
          //Do something here 
     }
     else
     {
         throw;
     }
}

throw不是0x42时,调试器将在NativeErrorCode上停止。

但如果你有这个

代码语言:javascript
复制
try
{
    DoSomethingThatThrows();
}
catch (Win32Exception exception) if (exception.NativeErrorCode == 0x00042)
{         
     //Do something here 
}

调试器将在DoSomethingThatThrows中停止(或者在它调用的方法中),让您更容易地看到导致错误的原因(同样,当NativeErrorCode不是0x42时)

票数 12
EN

Stack Overflow用户

发布于 2014-11-23 13:20:46

来自官方C#特征描述 (PDF下载链接,如在VS2015预览):

异常筛选器比捕获和重新抛出更好,因为它们不会损害堆栈。如果异常稍后导致堆栈被转储,那么您可以看到它最初的来源,而不仅仅是它被重新抛出的最后一个位置。 使用异常过滤器进行副作用也是一种常见的和被接受的“滥用”形式,例如日志记录。他们可以在不拦截航向的情况下检查异常“飞过”。在这种情况下,过滤器通常是对执行副作用的假返回助手函数的调用: 私有静态bool (异常e) { /*日志*/;返回false;}…尝试{…} catch (异常e) if (Log(e)) {}

票数 7
EN

Stack Overflow用户

发布于 2014-11-22 20:27:11

它允许在不捕获异常的情况下检查条件,这意味着如果不满足条件,则考虑下一个catch块。如果你接住并重投,下一个接球块就不会被考虑.

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27082069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档