8

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

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

4

5 回答 5

14

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

class A
{
    static A()
    {
        //buggy code here
    }
    static SomeField f = new ThisClassThrowsWhenConstructed(); // <-- or here
}
于 2012-09-06T17:54:55.673 回答
5

最后我发现这个问题的原因是我的项目的 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>

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

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

<appSettings>
    <add key="LogLevel" value="5"/>
</appSettings>
于 2013-10-26T03:52:09.300 回答
1

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

于 2012-09-06T17:50:14.723 回答
0

当您的类的静态构造函数出现错误时,有些东西不会抛出该错误,而是CLR会抛出TypeInitializationException.

于 2012-09-06T17:50:23.993 回答
0

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

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

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

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

于 2021-08-02T16:49:08.267 回答