如何调试“我的类的类型初始化器”引发异常“

时间:2012-09-06 17:48:05

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

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

我已经在网上阅读了一下,调试的一个解决方案是抛出TypeInitializationException,然后查看内部异常以找出错误。当我不知道用try / catch包围代码的位置时,我怎么能这样做?

5 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

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

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 中添加appsetting。

问题在 Project2 的appConfig中添加以下appsettings后,引发异常的类型初始化程序已经解决,

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

答案 2 :(得分:1)

当“我的类”的静态构造函数崩溃时抛出此异常。请把你的断点放在那里。

答案 3 :(得分:0)

在类的静态构造函数中有一些错误,而不是抛出该错误,CLR会抛出TypeInitializationException

答案 4 :(得分:0)

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

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

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

事实证明 B 的静态构造函数不好,因此 C 的静态构造不会发生。这很令人困惑,因为人们会认为一旦 B 的构造失败,错误就会出现。