C# “如何调试”;'的类型初始值设定项;我的班级';抛出了一个异常;
我遇到异常:C# “如何调试”;'的类型初始值设定项;我的班级';抛出了一个异常;,c#,asp.net,exception,exception-handling,C#,Asp.net,Exception,Exception Handling,我遇到异常:运行web应用程序后,“我的类”的类型初始值设定项在浏览器中引发异常。。由于这似乎是从视图(.aspx)生成的错误消息,因此我无法查看堆栈跟踪或此错误源的任何日志 我已经阅读了一些有关网络的内容,调试的一个解决方案是抛出一个TypeInitializationException,然后查看内部异常以找出问题所在。当我不知道在哪里用try/catch来包围代码时,我该如何做呢?当“我的类”的静态构造函数崩溃时,会引发此异常。请将断点放在那里。当类的静态构造函数出错时,CLR将抛出Type
运行web应用程序后,“我的类”的类型初始值设定项在浏览器中引发异常。
。由于这似乎是从视图(.aspx)生成的错误消息,因此我无法查看堆栈跟踪或此错误源的任何日志
我已经阅读了一些有关网络的内容,调试的一个解决方案是抛出一个
TypeInitializationException
,然后查看内部异常以找出问题所在。当我不知道在哪里用try/catch来包围代码时,我该如何做呢?当“我的类”的静态构造函数崩溃时,会引发此异常。请将断点放在那里。当类的静态构造函数出错时,CLR
将抛出TypeInitializationException
这可能是由错误的静态构造函数或静态属性/字段的错误内联初始化引起的。例如:
class A
{
static A()
{
//buggy code here
}
static SomeField f = new ThisClassThrowsWhenConstructed(); // <-- or here
}
A类
{
静态A()
{
//这里有错误代码
}
static SomeField f=new this classthrowswhenconstructed();//最后我发现问题的原因是我的项目的AppConfig设置。是的,我有两个C项目,Project1和Project2
Project1is包含静态类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设置仅在Project1中可用。因此,我们需要在Project2中添加appsettings
在项目2的appConfig中添加以下appsettings后,类型初始值设定项引发异常的问题已得到解决
<appSettings>
<add key="LogLevel" value="5"/>
</appSettings>
在“我的类”的构造函数中设置断点?你有静态构造函数吗?或者你在类中使用了任何静态变量吗?事实上,构造函数从未被击中,因为问题是将静态全局变量设置为web.config中不存在的参数键。我删除了该行,现在它可以工作了……是的,这是poss因为是静态的(也不是静态的)变量内联赋值是由C#编译器编译成构造函数的。这就解释了你的情况。来自@spender的回答提到了这一点。我想这是因为静态变量内联赋值的执行方式与未内联赋值的情况不同……谢谢你。即使在8年后的今天,我仍然试图使用类库来存储全局字符串使其保持静态:“public static readonly string applicationUncoded=“application/x-www-form-urlencoded””。这给了我一个初始化器错误。将它们更改为:“public const string applicationUncoded=“application/x-www-form-urlencoded””解决了我的问题。不确定原因,但问题来了!