我遇到了异常:The type initializer for 'my class' threw an exception.
在我的浏览器中运行我的 Web 应用程序后。由于这似乎是从视图 (.aspx) 生成的错误消息,因此我无法查看堆栈跟踪或任何日志以了解此错误的来源。
我已经在网上阅读了一些内容,调试的一种解决方案是抛出一个TypeInitializationException
然后查看内部异常以找出问题所在。当我不知道在哪里用 try/catch 包围代码时,我该怎么做?
我遇到了异常:The type initializer for 'my class' threw an exception.
在我的浏览器中运行我的 Web 应用程序后。由于这似乎是从视图 (.aspx) 生成的错误消息,因此我无法查看堆栈跟踪或任何日志以了解此错误的来源。
我已经在网上阅读了一些内容,调试的一种解决方案是抛出一个TypeInitializationException
然后查看内部异常以找出问题所在。当我不知道在哪里用 try/catch 包围代码时,我该怎么做?
这可能是由错误的静态构造函数或静态属性/字段的错误内联初始化引起的。例如:
class A
{
static A()
{
//buggy code here
}
static SomeField f = new ThisClassThrowsWhenConstructed(); // <-- or here
}
最后我发现这个问题的原因是我的项目的 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>
正在从Project2调用函数MyDetails.GetData(),这是我现在正在调试的项目。由于Project2 是目标项目,因此ConfigurationManager.AppSettings["LogLevel"]行将尝试从Project2读取设置 LogLevel 。但LogLevel设置仅在Project1中可用。所以,我们需要在Project2中添加 appsettings 。
在Project2的 appConfig 中添加以下 appsettings 后,引发异常的类型初始化程序已解决,
<appSettings>
<add key="LogLevel" value="5"/>
</appSettings>
当“我的班级”的静态构造函数崩溃时,将引发此异常。请把你的断点放在那里。
当您的类的静态构造函数出现错误时,有些东西不会抛出该错误,而是CLR
会抛出TypeInitializationException
.
提示:如果您在同一个类中有多个静态构造函数出错,请在第一个静态构造函数或所有静态构造函数上放置断点。
静态构造函数的不同寻常之处在于,当构造过程中出现问题时,它不会在构造发生的地方出错。稍后,在调用/使用静态构造的对象时,它会出错。
例如,在我的例子中:我有 3 个静态构造函数:A、B、C。程序错误输出并在访问 C 的值时暂停。我在 C 的静态构造函数上放了断点,断点没有被命中。怎么了?
结果 B 的静态构造函数不好,因此 C 的静态构造不会发生。这是令人困惑的,因为人们会认为一旦 B 的构造失败,错误就应该弹出。