我有一个Windows Forms应用程序和一个Editor
类(继承自Form
)。VS2010没有打破静态构造函数异常的调试
public partial class Editor : Form
{
public Editor()
{
InitializeComponent();
Load += Editor_Load;
}
private void Editor_Load(object sender, EventArgs e)
{
cmbConnections.DataSource = ConnectionManager.Connections;
cmbConnections.Visible = false;
}
}
比设计器生成的代码其他,这是为形式的唯一代码(即只包含单个组合框(cmbConnections
)。
的ConnectionManager
类是与一个静态构造一个静态类。它的构造函数会进行一些初始化,然后测试一些关键条件,如果条件满足,构造函数会抛出一个异常,但是这个异常在Visual Studio 2010的调试模式下不会中断。为了测试这个,我只把throw new Exception()
在ConnectionManager
的静态构造函数中。使用ConnectionManager
并为此初始化(第一次)在Editor_Load
事件处理程序。调用静态构造函数并引发异常(仅在输出窗口中可见)。正如预期的那样,Editor_Load
事件处理程序(cmbConnections.Visible = false;
)的其余部分未执行。
但我不明白的是为什么我的VS2010吞下异常?它没有打破调试。它不包含在任何try/catch块中。它继续在主窗口中执行程序。它看起来好像在另一个线程上执行Editor_Load
。
我可以看到在输出窗口中的消息:
“System.InvalidOperationException”类型的第一次机会异常出现在Editor.exe
型“System.TypeInitializationException”的第一次机会异常发生在Editor.exe中
但是执行在调试模式下根本没有中断。
下面是一些我的选择,我认为可能会影响此行为:
项目属性 - >建设 - >常规 - >优化代码没有被选中。
工具 - >选项 - >调试 - >常规 - >启用只是我的代码被检查。
在例外设置中,“用户未处理”的复选框为“已检查”。
我错过了什么吗?这种行为是否正常?我认为VS2010会抛出任何未处理的异常。这里这个没有处理,仍然没有破坏。
你忘了提及你有一个64位操作系统。蹩脚的问题,简单修复:Project + Properties,Build选项卡,将Platform目标从x86更改为AnyCPU。 – 2012-02-10 00:32:21
我还没有能够检查我的x64系统(我昨天正在开发)。不过,我已经在x86系统上尝试过相同的解决方案,并且确实打破了VS2010。所以我猜你的评论可能是正确的。我建议你发布这个答案。导致所有其他答案都包含与问题无关的信息,但仅仅解释了VS2010异常处理的工作方式。我的问题是关于为什么VS2010的行为超出了它自己的标准 - 我想你已经回答了 - 这是x64系统上的某种错误。我会尽快在x64上进行测试,以确认。 – 2012-02-10 09:48:28
[VS2010在64位WinForms应用程序中未显示未处理的异常消息]的可能重复(http://stackoverflow.com/questions/4933958/vs2010-does-not-show-unhandled-exception-message-in-a -64位winforms应用程序) – 2012-02-10 12:36:00