什么是“第一次机会例外”?


Answers:


78

这是一个调试概念。基本上抛出异常给调试器第一,然后到如果不处理它被扔在了调试器的实际程序第二的时候,给你一个机会,之前和应用程序本身后,用它做的东西在你的IDE。这似乎是Microsoft Visual Studio的发明。


21
它不只是调试概念;C#没有提供在运行时观察两次通过异常处理的便捷方法,但是vb.net却提供了这种方法。基本上,当引发异常时,运行时将从搜索调用堆栈开始,以找出是否有人将其捕获。该过程发生任何finally块运行之前。一旦系统确定谁将捕获异常(并确定确实有人将要捕获),系统将开始展开堆栈。请注意,如果从某个finally块引发了异常……
supercat

18
...原本希望捕获原始异常的代码可能最终不这样做;有很多奇怪的极端案例。
2013年

5
当您将调试器配置为在所有抛出的异常(不仅仅是未处理的异常)处中断时,或者如果您“逐步”进入某个抛出的语句,就会发生这种情况。您会看到消息YourApp.exe中发生了'foo'类型的首次机会异常。您仍然可以继续(F5)或进一步(F11)。然后,如果catch对此有控制,则转到那里。如果没有catch阻止,则会出现“第二次机会”中断,这一次消息是YourApp.exe中发生了'foo'类型的未处理异常。从这里开始,尝试继续或进一步前进将不会成功。
Jeppe Stig Nielsen

@supercat:我如何了解上面评论中提到的细节?这是自我实验的结果吗?看书(哪一本)?这是一个非常令人印象深刻的见解!如果您能抽出一点时间回答这个问题,我将不胜感激
–nish

2
@NoSaidTheCompiler:我已经在各种博客中阅读了有关异常处理的信息;我希望搜索“ exception filter .net”会打开一些有关此主题的博客。
超级猫


4

我刚开始使用调试器并遇到了这个问题。在我的研究中,我发现了MSDN博客文章什么是第一次机会异常?那为我清除了。

对我而言,该博客文章的主要收获是,它指的是通知调试器,而不是我的代码不一定要处理的事情,而且最重要的是,“首次机会异常消息通常并不意味着在调试器中存在问题。码。”


请摘录(而不是整篇文章)您从该链接中发现有帮助的内容。有一个较早的仅链接答案,且该链接已被删除。
2014年

对我来说,最大的收获是它指向调试器的通知,而不是我的代码不一定要处理的东西,最重要的是,“第一次机会异常消息通常并不意味着代码中有问题。”
编码

我在您的答案中添加了您的评论,我认为该链接非常重要,可以继续浏览,我试图确保不会像上次给出的那样仅将其视为仅答案的链接。
马克·霍尔

0

在调试应用程序时,每当遇到异常时,调试器都会收到通知。此时,应用程序已挂起,调试器决定如何处理异常。通过这种机制的第一次通过称为“第一次机会”异常。

根据调试器的配置,它会恢复应用程序并传递异常,或者使应用程序挂起并进入调试模式。如果应用程序处理了异常,它将继续正常运行。

首次机会异常消息通常并不意味着代码中有问题。对于能够正常处理异常的应用程序/组件,首次机会异常消息会让开发人员知道遇到并已处理了异常情况。


0

从开发人员的角度来看,它更多地涉及第二次机会异常,因为这意味着它没有在代码中处理;因此应用程序将停止。

第一次机会可能很多,但是从开发的角度来看,更多需要关注的是第二次机会,因为这将导致应用程序崩溃。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.