【问题标题】:What is a "first chance exception"?什么是“第一次机会例外”?
【发布时间】:2010-10-08 13:24:41
【问题描述】:

究竟什么是第一次机会异常?它是如何以及从何处起源于 .NET 程序的?为什么会用那个奇特的名字来称呼它(我们所说的“机会”是什么)?

【问题讨论】:

    标签: .net visual-studio debugging exception first-chance-exception


    【解决方案1】:

    这是一个调试概念。基本上异常会被抛出到调试器 first 然后到实际的程序,如果它没有被处理,它会在 second 时间被抛出到调试器,给你一个 机会 在应用程序之前和之后在 IDE 中使用它。这似乎是 Microsoft Visual Studio 的一项发明。

    【讨论】:

    • 这不仅仅是一个调试概念; C# 没有提供在运行时观察两次异常处理的便捷方法,但 vb.net 提供了。基本上,当抛出异常时,运行时开始搜索调用堆栈以找出是否有人要捕获它。该过程发生在任何finally 块运行之前。一旦系统决定谁将捕获异常(并确定某人实际上会捕获异常),系统将开始展开堆栈。请注意,如果从 finally 块中抛出异常...
    • ...期望捕获原始异常的代码可能最终没有这样做;有很多奇怪的极端情况。
    • 当您将调试器配置为中断所有抛出的异常(不仅仅是未处理的异常),或者如果您“单步”进入某个抛出的语句时,就会发生这种情况。您会看到消息YourApp.exe 中发生了“foo”类型的第一次机会异常。您仍然可以继续 (F5) 或进一步 (F11)。然后,如果有一个catch,控制就到那里。如果没有catch 块,您将获得“第二次机会”中断,这一次消息是YourApp.exe 中发生'foo' 类型的未处理异常。从这里开始,尝试继续或更进一步将不会成功。
    • @supercat:我如何了解您在上面的 cmets 中提到的细节?是自我实验的结果吗?看书(哪一本)?这是一个非常令人印象深刻的见解!如果您能花点时间回答这个问题,我将不胜感激...
    • @NoSaidTheCompiler:我在各种博客中阅读了有关异常处理的信息;我希望搜索“exception filter .net”应该会出现一些关于该主题的博客。
    【解决方案2】:

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

    First and second chance exception handling

    【讨论】:

      【解决方案3】:

      我刚开始使用调试器并遇到了这个问题。在我的研究中,我发现 MSDN 博客文章 What is a First Chance Exception? 为我清除了它。

      对我来说,这篇博文的最大收获是它指的是对调试器的通知,而不是我的代码必须处理的事情,最重要的是,

      “第一次机会异常消息通常并不意味着存在 代码有问题。”

      【讨论】:

        【解决方案4】:

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

        根据调试器的配置,它要么恢复应用程序并传递异常,要么让应用程序暂停并进入调试模式。如果应用程序处理了异常,它会继续正常运行。

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2011-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多