【问题标题】:Silent failures in C#, seemingly unhandled exceptions that does not crash the programC# 中的静默失败,看似未处理的异常,不会使程序崩溃
【发布时间】:2009-10-17 22:11:25
【问题描述】:

在 winforms 应用中,在表单的 Load 事件中,添加以下行:

throw new Exception();

并运行应用程序。它运行没有问题。这称为静默失败,您可以尝试在前后添加消息框,您很快就会发现 throw 语句并没有让应用程序崩溃,而是从 Load 事件中退出。

我确信没有必要解释这是多么丑陋和危险。

我仍然想知道这种可怕行为背后的(可能是历史)原因。 我敢肯定这不是一个设计决定,可能是没有选择,或者是懒惰。有人知道吗?

如果有人能指出可能导致 seilent 失败的事件列表,我会很高兴。

这是我的代码的 sn-p - 我不知道它有什么帮助 - 但是,这里是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Form f = new Form();
            f.Load += new EventHandler((x, y) => { throw new Exception(); });
            Application.Run(f);
        }

    }
}

编辑 似乎它并没有发生在每个人身上。 我用的是:fw 3.5, winforms, vs 2008, vista x64, new clean project of winforms,上面的代码。

【问题讨论】:

  • 您能否进一步解释您的表单的 OnLoad 事件处理程序中的 sn-p 问题。此外,您在此应用程序域中是否有 UnhandledException 处理程序?如果这是应用程序的主要形式,并且由于您引发了未处理的异常而无法加载,您期望会发生什么?我怀疑在这种情况下会调用您未处理的事件处理程序。
  • 你用的是什么版本的windows?
  • 我实际上再次否决了你之前的问题,它写得不好而且傲慢......
  • 这里没有回答您的问题:blogs.msdn.com/ericlippert/archive/2008/02/20/…

标签: c# winforms 64-bit exception


【解决方案1】:

这是known problem on x64 systems

这是 64 位操作系统上的已知问题 平台。原因是64位 操作系统内核不允许用户模式 通过内核模式堆栈的异常。 异常被操作系统吞噬 悄悄地。这发生在 FormLoad 处理程序,因为它是在操作系统中调用的 打回来。 32位操作系统不这样做, 所以它不会在那里重现。

操作系统团队正在调查相关的 问题。与此同时,你确实有 解决这个问题。开启 “停止第一次机会例外”将 使调试器在此停止 设想。但它确实使 调试器经常停止,所以你 可能只想在您这样做时 发现问题。

链接的错误报告最后一次更新是 2008 年 2 月,并没有说明从那以后发生了什么。

我可以在我的 32 位系统上重现大多数海报的行为,我可以在我的 64 位(Vista SP2、3.5SP1 框架)工作 PC 上重现 OP 的行为。

【讨论】:

  • 非常感谢..我记得这在 x86 上也发生在我身上,但我不确定.. 我会检查一下。
  • 有趣的是,当我在没有调试的情况下运行时,我的 Windows 7 x64 机器上的这个异常不会被吞没,但在我这样做时会被吞下。
  • @FacticiusVir:这里完全一样。在我的 Win7 x64 上,它只有在我处于 VS 调试模式时才会被吞下。
  • 有一个 API 可以解决这个问题。请参阅my answer here 了解如何在 C# 中使用它。
猜你喜欢
  • 2021-11-13
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多