首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中的无声故障,看似未经处理的不会使程序崩溃的异常

C#中的无声故障,看似未经处理的不会使程序崩溃的异常
EN

Stack Overflow用户
提问于 2009-10-17 22:11:25
回答 1查看 7.4K关注 0票数 40

在winforms应用程序中,在窗体的Load事件中,添加以下行:

代码语言:javascript
运行
复制
throw new Exception();

运行应用程序。没问题就跑了。这称为无声失败,您可以尝试在前后添加消息框,很快就会发现,抛出语句不是崩溃应用程序,而是退出Load事件。

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

尽管如此,我还是想知道这种恐怖行为背后的原因(可能是历史)。我相信这不是一个设计上的决定,可能是没有选择,或者懒惰。有人知道吗?

如果有人能告诉我一系列可能导致严重失败的事件,我会很高兴的。

下面是我的代码片段--我不知道它会有什么帮助--但是,这里是:

代码语言:javascript
运行
复制
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);
        }

    }
}

编辑,似乎并不是每个人都能做到。我使用:FW3.5,winforms,vs 2008,vista x64,winforms的新清洁项目,以及上面提到的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-17 22:50:06

这是一个x64系统上的已知问题

这是一个已知的64位操作系统平台上的问题。原因是64位OS内核不允许通过内核模式堆栈进行用户模式异常。这个例外被操作系统轻描淡写地吞没了。这发生在FormLoad处理程序中,因为它是在OS回调中调用的。32位操作系统不这样做,所以它不会在那里复制。 操作系统小组正在调查相关问题。同时,你也必须解决这个问题。打开“一次机会异常上的停止”将使调试器在此场景中停止。但是它确实使调试器经常停止,所以您可能只想在发现问题时才这样做。

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

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

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

https://stackoverflow.com/questions/1583351

复制
相关文章

相似问题

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