3

我有一个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会抛出任何未处理的异常。这里这个没有处理,仍然没有破坏。

+2

你忘了提及你有一个64位操作系统。蹩脚的问题,简单修复:Project + Properties,Build选项卡,将Platform目标从x86更改为AnyCPU。 – 2012-02-10 00:32:21

+0

我还没有能够检查我的x64系统(我昨天正在开发)。不过,我已经在x86系统上尝试过相同的解决方案,并且确实打破了VS2010。所以我猜你的评论可能是正确的。我建议你发布这个答案。导致所有其他答案都包含与问题无关的信息,但仅仅解释了VS2010异常处理的工作方式。我的问题是关于为什么VS2010的行为超出了它自己的标准 - 我想你已经回答了 - 这是x64系统上的某种错误。我会尽快在x64上进行测试,以确认。 – 2012-02-10 09:48:28

+0

[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

回答

1

我认为这是设计,你需要启用异常对话框中的托管(.NET)异常'投掷'(Ctrl-Alt-E)。

为了避免很多虚假的(已处理)异常,我通常会尽量接近初始化程序的运行点,然后在继续之前检查该复选框。另外,如果有加载程序异常,请确保在异常中检查嵌套的内部异常或加载程序信息:异常本身通常不是那种提供信息的。我经常不得不挖掘2层或更多层的包装异常,才能看到实际的错误。


我只可以猜测为什么是;我的感觉是,静态类型初始化不被认为是确定性地运行(许多事情可能会触发它,而且顺序通常是未定义的;只能保证一个类型的静态构造函数将在使用之前运行,但它可以是几乎可以在代码中的任何一点使用,而不需要知道或明确地触发它)。

因此,这将是很难的运行时间,以确定是否有人(没有用户应期待来处理它,因为它不知道“用户代码来处理” - 确定性 - 初始化会跑)。

但是,这是我的猜想。