【发布时间】:2011-11-26 05:51:22
【问题描述】:
这变得非常烦人。现在我有一个 winforms 应用程序,但事情不正常,但据我所知,没有抛出异常。在浏览了几乎所有相关代码之后,事实证明在我的应用程序开始时抛出了一个异常。
长话短说,在 WinForms 中,尽管发生异常,但 WinForms 库会忽略它。没有“发生未处理的异常”JIT 消息被抛出,它只是停止处理当前事件并返回到 GUI。
这会导致随机错误,因为加载数据之前发生的异常导致加载数据的代码没有被调用。
为了看到这一点,我创建了一个全新的 WinForms 应用程序,并输入了以下代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string blah = null;
blah.Trim();
}
}
按 F5 并加载表单而不会显示任何错误,即使抛出空引用也是如此。
然后我尝试转到我的 Program.cs 主要方法并将 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 添加到它。我的表单仍然加载而不会引发任何错误。
尽管我知道我可以告诉 VS 中断所有异常,但我发现这种情况非常糟糕。它会导致在生产环境中难以调试的非常奇怪的问题,而且由于这是一个内部工具,我真的很想拥有它,所以当异常发生时它实际上会出错,而不是默默地忽略它。
有人知道怎么做吗?
更新: 只是为了更新我从 cmets 学到的东西。
这似乎是 Windows 的 64 位问题,正如我从 this question 了解到的,我在发布之前没有看到。在那个问题中,它指向了一个Microsoft bug report,它有这样的说法:
你好,
此错误已作为“外部”关闭,因为此行为是由 x64 版本的 Windows 处理异常的方式引起的。当用户模式异常跨越内核转换时,x64 版本的 Windows 不允许传播异常。因此,附加的调试器不知道发生了异常,导致调试器无法中断未处理的异常。
不幸的是,Visual Studo 团队无法解决这个问题,这是操作系统设计的结果。有关此问题的所有反馈都应提交给 Windows 团队;但是 Windows 团队认为这是“正确”的操作系统设计,并认为 x86 行为是“不正确的”。
最好的问候, Visual Studio 调试器
话虽如此,如果您的Program.cs 中有以下代码,则不通过 Visual Studio 运行的构建(或使用 Ctrl+F5 运行)似乎会显示 JIT 异常消息框 EXCEPT :
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
该代码将导致窗口忽略异常。
但是,如果您(改为)订阅 Application.ThreadException 事件,不仅您的异常会被捕获,Visual Studio 的调试器会在未处理的异常上中断!
【问题讨论】:
-
您尝试订阅 Application.UnhandledException 吗?
-
@Tigran: 坏主意,恕我直言...我做了一次 ...
-
您确定订阅了 Form.Load 事件吗? ...只是一个健全的检查;)
-
有趣的链接,虽然一切都符合这个问题,但我的平台已经设置为 x86 并且无法修复它