在winforms应用程序中,在窗体的Load事件中,添加以下行:
throw new Exception();
运行应用程序。没问题就跑了。这称为无声失败,您可以尝试在前后添加消息框,很快就会发现,抛出语句不是崩溃应用程序,而是退出Load事件。
我相信没有必要解释这是多么丑陋和危险。
尽管如此,我还是想知道这种恐怖行为背后的原因(可能是历史)。我相信这不是一个设计上的决定,可能是没有选择,或者懒惰。有人知道吗?
如果有人能告诉我一系列可能导致严重失败的事件,我会很高兴的。
下面是我的代码片段--我不知道它会有什么帮助--但是,这里是:
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的新清洁项目,以及上面提到的代码。
发布于 2009-10-17 22:50:06
这是一个x64系统上的已知问题
这是一个已知的64位操作系统平台上的问题。原因是64位OS内核不允许通过内核模式堆栈进行用户模式异常。这个例外被操作系统轻描淡写地吞没了。这发生在FormLoad处理程序中,因为它是在OS回调中调用的。32位操作系统不这样做,所以它不会在那里复制。 操作系统小组正在调查相关问题。同时,你也必须解决这个问题。打开“一次机会异常上的停止”将使调试器在此场景中停止。但是它确实使调试器经常停止,所以您可能只想在发现问题时才这样做。
链接错误报告是在2008年2月更新的,没有说明自那以后发生了什么。
在这里,我可以在我的32位系统上复制大多数海报的行为,我也可以在我的64位(Vista SP2,3.5SP1框架)工作PC上再现OP的行为。
https://stackoverflow.com/questions/1583351
复制相似问题