运行我的Web应用程序后,我在浏览器中收到异常:The type initializer for 'my class' threw an exception.
。由于这似乎是从视图(.aspx)生成的错误消息,因此我无法看到堆栈跟踪或此错误源的任何日志。
我已经在网上阅读了一下,调试的一个解决方案是抛出TypeInitializationException
,然后查看内部异常以找出错误。当我不知道用try / catch包围代码的位置时,我怎么能这样做?
答案 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 的构造失败,错误就会出现。