Let*_*man 40 c# 64-bit exception winforms
在winforms应用程序中,在表单的Load事件中,添加以下行:
throw new Exception();
Run Code Online (Sandbox Code Playgroud)
并运行该应用程序.它运行没有问题.这称为静默失败,您可以尝试在之前和之后添加消息框,并且您很快就会发现,而不是崩溃应用程序,throw语句只是从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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑 它似乎不会发生在每个人身上.我使用:fw 3.5,winforms,vs 2008,vista x64,winforms的新干净项目,上面提到的代码.
Mic*_*tta 46
这是64位OS平台上的已知问题.原因是64位OS核心不允许通过内核模式堆栈的用户模式异常.操作系统很容易吞下这个例外.这种情况发生在FormLoad处理程序中,因为它是在OS回调中调用的.32位操作系统不会这样做,因此它不会重现.
操作系统团队正在调查相关问题.与此同时,您必须解决此问题.启用"在第一次机会异常时停止"将使调试器在此方案中停止.但它确实使调试器经常停止,因此您可能只想在发现问题时才这样做.
链接的错误报告最后更新于2008年2月,并未指出自那时以来发生的情况.
我可以在32位系统上重现大多数海报的行为,我可以在我的64位(Vista SP2,3.5SP1 Framework)工作PC上重现OP的行为.
| 归档时间: |
|
| 查看次数: |
6693 次 |
| 最近记录: |