“first chance exception”是什么?

125

什么是第一次机会异常?它在 .NET 程序中是如何产生的?为什么它被称为这个奇特的名字(我们说的什么“机会”)?

5个回答

95

这是一个调试概念。基本上,异常首先被抛给调试器,然后再传递到实际程序中,如果未被处理,则会再次抛回到调试器中,从而使您有机会在应用程序本身之前和之后在IDE中处理异常。这似乎是微软Visual Studio的发明。


26
这不仅是一个调试概念; C#在运行时没有提供方便的观察两段式异常处理的手段,但是vb.net则提供了。基本上,当抛出异常时,运行时会从调用堆栈向上查找,以确定是否有任何人要捕获它。这个过程发生在任何 finally 块运行之前。一旦系统决定谁将捕获异常(并确定确实有人会),系统将开始展开堆栈。请注意,如果从 finally 块中抛出异常... - supercat
25
原文:the code which was expecting to catch the original exception may end up not doing so; there are many weird corner cases. 翻译:原本期望捕获异常的代码可能最终未能实现;存在许多奇怪的边界情况。 - supercat
10
当你将调试器配置为在所有被抛出的异常(而不仅仅是未处理的异常)时中断,或者当你"step"进入某个会抛出异常的语句时,就会发生这种情况。你会看到消息 A first chance exception of type 'foo' occurred in YourApp.exe。你仍然可以继续执行(按F5键)或向前步进(按F11键)。如果存在相应的 catch 块,程序的控制权将转移到那里。如果没有 catch 块,则会发生 "second-chance" 中断,这次消息是 An unhandled exception of type 'foo' occurred in YourApp.exe。从这里开始,尝试继续执行或向前步进都不会成功。 - Jeppe Stig Nielsen
@supercat:我该如何了解您在上面评论中提到的细节?这是自我实验的结果吗?阅读了哪些书籍(是哪一本)?这是非常令人印象深刻的见解!如果您能抽出一点时间回答这个问题,我将不胜感激... - haku
2
@NoSaidTheCompiler:我在各种博客中阅读了关于异常处理的内容;我认为搜索“exception filter .net”应该会出现一些有关此主题的博客。 - supercat

25

第一次机会异常通知是在抛出异常时触发的。第二次机会通知是当它没有被捕获时。 (机会-作为在调试器中进入代码的机会)。

第一和第二次机会异常处理


7
我刚开始使用调试器就遇到了这个问题。在我的研究中,我找到了MSDN博客文章什么是First Chance Exception?,它为我解决了这个问题。
对我来说,博客文章的重点是它指的是通知调试器,并不一定需要我的代码去处理,最重要的是:

"First chance exception messages most often do not mean there is a problem in the code."


1

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

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


0

当应用程序进行调试时,每当遇到异常时,调试器都会被通知。此时,应用程序被暂停,调试器决定如何处理异常。这个机制的第一次通过称为“第一次机会”异常。

根据调试器的配置,它将恢复应用程序并传递异常,或者保持应用程序暂停并进入调试模式。如果应用程序处理异常,则继续正常运行。

第一次机会异常消息通常不意味着代码存在问题。对于能够优雅地处理异常的应用程序/组件,第一次机会异常消息让开发人员知道已经遇到了一种异常情况,并已经处理过了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接