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

Tim*_*man 4 c# static visual-studio-2005 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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

为什么是这样?

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

这是VS2005,.Net 2.0

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

Rob*_*ser 8

问题是抛出的异常实际上是一个TypeInitializationException,它包装抛出的任何异常.我不确定是什么设计权衡造成这种情况,但是IMO它是.NET开发中最烦人的事情之一,我很遗憾看到它仍然存在于.NET 4中.

在VS中,要尽快捕获异常,您需要启用第一次机会异常.转到Debug> Exceptions并选中"Common Language Runtime Exceptions",它会在抛出异常时立即中断.

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