Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';Visual Studio在静态构造函数中发生异常时是否显示异常消息?_C#_Visual Studio 2005_Static_Exception - Fatal编程技术网

C# 为什么';Visual Studio在静态构造函数中发生异常时是否显示异常消息?

C# 为什么';Visual Studio在静态构造函数中发生异常时是否显示异常消息?,c#,visual-studio-2005,static,exception,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",t

我正在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
  }
}
公共类MyHandlerFactory:IHttpHandlerFactory
{
私有静态字典myDictionary=新字典();
静态MyHandlerFactory()
{
添加(“someKey”,true);
myDictionary.Add(“someKey”,true);//由于密钥重复而失败
}
}
在静态构造函数之外,当我到达错误行时,VisualStudio会突出显示它并弹出一条关于异常的消息。但是在静态构造函数中,我没有得到这样的消息。我一行一行地走,所以我知道我已经走到了那一行,再也走不远了

为什么会这样

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

这是VS2005,.NET2.0


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

问题是抛出的异常实际上是一个TypeInitializationException,它封装了抛出的任何异常。我不确定是什么设计折衷导致了这种情况,但在我看来,这是.NET开发中最烦人的事情之一,我很难过地看到它仍然存在于.NET4中

在VS中,要尽快捕获异常,您需要启用第一次机会异常。转到Debug>Exceptions并选中“公共语言运行时异常”,它将在引发异常时立即中断


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

我尝试了您的代码,得到了您期望的TypeInitializationException。在我的VS中没有问题


但是,如果您在“未调试”的情况下运行此(或任何其他)应用程序,则对于任何未处理的异常,您应该始终会收到一条错误消息-没有VS设置会在此处产生影响

静态构造函数在应用程序在appdomain中运行之前运行。这可能会导致VS捕获异常的方式出现问题,从您的描述来看,这是非常不标准的。这可能是2005年的限制。这就是为什么您应该始终在静态构造函数的主体内捕获。在新书《有效的C#

中对此进行了极好的讨论,谢谢你的回答。但是,我在调试>异常中看到的选择。。。是“C++异常”、“公共语言运行时异常”、“托管调试助手”、“本机运行时检查”和“Win32异常”。“.Net异常”是否在其中一项下?我找不到它。@Tim Goodman--哎呀!我的意思是“公共语言运行时异常”。我会更新我的答案。啊,是的,当抛出公共语言运行时异常时使其中断会导致内部异常中断。谢谢。“因为这显然使用了流控制的异常”-很有趣。你的意思是在编译时?所以,它通过尝试和错误来计算类型?@andy——当您第一次在DLR中引用synamic成员时,.NET运行时抛出一个MissingMemberException,我猜DLR在某个地方捕获到它并导致它被编译。。。但是,如果您在上有第一次机会的异常,它将一直暂停。您在哪一行得到TypeInitializationException?我认为现在的问题是,它通常会在引用类的第一行给出一个错误(导致调用静态构造函数的那一行),但在本例中,它被称为HttpHandler,因此没有行可去。TypeInitializationException出现在我创建类的新实例的行上:MyHandlerFactory=new MyHandlerFactory();但是我没有使用它派生的接口就尝试了它。也许你可以扩展这个示例,我们可以对它进行测试,因为它在你的代码中。今天我碰巧又看到了这个7年前的问题,所以我想我对你的评论的回答已经晚了。:)为了重现这个问题,我认为有必要在ASP.NET Web应用程序的Web.config中注册HTTP处理程序(请参见此处:),并通过尝试加载Web应用程序的页面来访问它。