4

我有一个带有单个Editor类(继承自Form)的 Windows 窗体应用程序。

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是在另一个线程上执行的。

我可以在输出窗口中看到消息:

在 Editor.exe 中发生了“System.InvalidOperationException”类型的第一次机会异常

在 Editor.exe 中发生了“System.TypeInitializationException”类型的第一次机会异常

但执行根本没有在调试模式下中断。

以下是我认为可能会影响此行为的一些选项:

项目属性->构建->常规->优化代码未选中。

工具->选项->调试->常规->仅启用我的代码已选中。

在异常设置中,“用户未处理”的复选框已选中。

我错过了什么吗?这种行为正常吗?我认为 VS2010 会抛出任何未处理的异常。而这里这个是未处理的,仍然没有中断。

4

1 回答 1

1

我认为您需要在“异常”对话框 ( Ctrl-Alt-E) 中启用“抛出”托管 (.NET) 异常是设计使然。1

为了避免许多虚假(已处理)异常,我通常会尝试接近初始化程序将运行的点,然后在继续之前选中该复选框。

此外,如果存在加载程序异常,请务必检查嵌套的内部异常或异常中的加载程序信息:异常本身通常没有那么丰富的信息。我经常不得不挖掘 2 层或更多层的包装异常,以了解实际的错误。


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

因此,运行时很难确定它是否“由用户代码处理”(用户不应该期望处理它,因为它不知道 - 确定性 -初始化程序何时运行)。

然而,这是我的猜测。

于 2012-02-09T23:44:57.603 回答