【问题标题】:How to debug "The type initializer for 'my class' threw an exception"如何调试“'我的班级'的类型初始化程序引发异常”
【发布时间】:2012-08-31 14:26:53
【问题描述】:

运行 Web 应用程序后,我在浏览器中遇到异常:The type initializer for 'my class' threw an exception.。由于这似乎是从视图 (.aspx) 生成的错误消息,因此我无法查看堆栈跟踪或任何日志以了解此错误的来源。

我在网上阅读了一些内容,调试的一种解决方案是抛出TypeInitializationException,然后查看内部异常以找出问题所在。当我不知道在哪里用 try/catch 包围代码时,我该怎么做?

【问题讨论】:

  • 在“我的班级”的构造函数中设置断点?
  • 你有静态构造函数吗?还是在类中使用任何静态变量?

标签: c# asp.net exception exception-handling


【解决方案1】:

提示:如果您在同一个类中有多个静态构造函数出错,请在第一个静态构造函数或所有静态构造函数上放置断点。

静态构造函数的不寻常之处在于,当构造过程中出现问题时,它不会在构造发生的地方出错。稍后,在调用/使用静态构造的对象时,它会出错。

例如,在我的例子中:我有 3 个静态构造函数:A、B、C。程序错误输出并在访问 C 的值时暂停。我在 C 的静态构造函数上放了断点,断点没有被命中。会发生什么?

原来 B 的静态构造函数不好,所以 C 的静态构造不会发生。这很令人困惑,因为人们会认为一旦 B 的构造失败就应该弹出错误。

【讨论】:

    【解决方案2】:

    最后我发现这个问题的原因是我的项目的 AppConfig 设置。是的,我有两个 C# 项目,Project1Project2

    Project1 包含静态类MyDetails

    public static MyDetails
    {
      public static int _LogLevel = Int32.Parse(ConfigurationManager.AppSettings["LogLevel"])
    
      public static GetData()
       {
         ----code----
         ----code----
       }
    }
    

    我在 Project1 中有以下 appConfig 设置

    <appSettings>
        <add key="LogLevel" value="5"/>
    </appSettings>
    

    函数 MyDetails.GetData() 正在从 Project2 调用,这是我现在正在调试的项目。由于 Project2 是目标项目,ConfigurationManager.AppSettings["LogLevel"] 行将尝试从 Project2 读取设置 LogLevel。但 LogLevel 设置仅在 Project1 中可用。所以,我们需要在Project2中添加appsettings。

    Project2的appConfig中添加以下appsettings后,抛出异常的类型初始化器已解决,

    <appSettings>
        <add key="LogLevel" value="5"/>
    </appSettings>
    

    【讨论】:

      【解决方案3】:

      当“我的班级”的静态构造函数崩溃时,会引发此异常。请把你的断点放在那里。

      【讨论】:

      • 事实上,构造函数从未被命中,因为问题在于将静态全局变量设置为 web.config 中不存在的参数键。我删除了这条线,现在它可以工作了......
      • 是的,这是可能的,因为静态(而不是静态)变量内联赋值由 C# 编译器编译成构造函数。这解释了你的情况。 @spender 的回答提到了这一点。
      • 我想这是因为静态变量内联赋值的执行方式与未内联赋值的情况不同...
      【解决方案4】:

      这可能是由错误的静态构造函数或静态属性/字段的错误内联初始化引起的。例如:

      class A
      {
          static A()
          {
              //buggy code here
          }
          static SomeField f = new ThisClassThrowsWhenConstructed(); // <-- or here
      }
      

      【讨论】:

      • 谢谢你。即使在 8 年的今天,我仍在尝试使用类库来存储全局字符串,使它们像这样静态:' public static readonly string ApplicationUrlEncoded = "application/x-www-form-urlencoded";'。这给了我一个初始化错误。将它们更改为:' public const string ApplicationUrlEncoded = "application/x-www-form-urlencoded";'解决了我的问题。不知道为什么,但你去吧!
      【解决方案5】:

      当类的静态构造函数出现错误时,CLR 不会抛出该错误,而是会抛出 TypeInitializationException

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        • 2013-05-15
        • 2013-11-08
        • 2019-07-08
        相关资源
        最近更新 更多