当我在静态构造函数中发生异常时,为什么Visual Studio不显示异常消息?

时间:2010-03-25 21:01:09

标签: c# visual-studio-2005 static exception

我在调试模式下在Visual Studio中运行此C#代码:

public class MyHandlerFactory : IHttpHandlerFactory
{
  private static Dictionary<string, bool> myDictionary = new Dictionary<string, bool>();
  static MyHandlerFactory()
  {
    myDictionary.Add("someKey",true);
    myDictionary.Add("someKey",true); // fails due to duplicate key
  }
}

在静态构造函数之外,当我到达错误的行时,Visual Studio会突出显示它并弹出有关异常的消息。但是在静态构造函数中,我没有得到这样的消息。我逐步走过,所以我知道我已经到了那条线而且没有了。

为什么会这样?

(我不知道我的类实现IHttpHandlerFactory的事实是否重要,但是为了以防万一我将它包括在内。)

这是VS2005,.Net 2.0

编辑:我只是想补充一下,这是一个HttpHandler 的事实似乎很重要。正如答案所示,默认行为是打破TypeInitializationException而不是内部异常。我在没有HttpHandler的情况下测试了另一个例子,发现这导致程序在使用该类的第一行中断。但在这种情况下,我的代码中没有任何行可以打破,因为该类只被调用为我的web.config文件中指定的HttpHandler。因此,它根本没有打破这个例外。

3 个答案:

答案 0 :(得分:8)

问题是抛出的异常实际上是一个TypeInitializationException,它包装抛出的异常。我不知道什么样的设计权衡造成这一点,但IMO它是在.NET开发中最头疼的事情之一,我很伤心看到它仍然是围绕在.NET 4中。

在VS中,要尽快捕获异常,您需要启用第一次机会异常。转到Debug&gt;异常并检查“公共语言运行时异常”,一旦抛出异常就会中断。

(注意:如果您正在使用动态语言运行时,则需要更加挑剔捕获的异常,因为这显然会使用流控制的异常)。

答案 1 :(得分:1)

我尝试了你的代码,我得到了你想象的TypeInitializationException。我的VS没问题......

但是如果你在没有调试的情况下运行这个(或任何其他)应用程序,你应该总是得到任何未处理异常的错误消息 - 没有VS设置会在这里产生影响。

答案 2 :(得分:0)

静态构造函数在应用程序在appdomain中运行之前运行。这可能会导致VS捕获异常的方式出现问题,这与您的描述完全不符合标准。它可能是2005年的限制。这就是为什么你应该总是在静态构造函数的主体内捕获。新书Effective C#

对此进行了很好的讨论