类型初始值设定项引发异常
今天在使用VS2010调试程序时,出现这个自己以前从未接触过的错误“类型初始值设定项引发异常”。自己上网查找了相关资料,终找到原因,先记录下来。
问题:
在我的项目里,有一个数据库助手类“SqlHelper”,其中的成员皆是静态成员。但由于我改动这个类时,类中的数据库连接变量未被具体赋值,代码如下:
private static string connstr = ConfigurationManager.ConnectionStrings[" "].ConnectionString;
正确时应该是这样的:
private static string connstr = ConfigurationManager.ConnectionStrings["DB_OnLineExamConnectionString"].ConnectionString;
其中“DB_OnLineExamConnectionString”是web配置文件中的数据库连接字符串。
所以,由于一个本不该有的疏忽导致了这个错误,惭愧!
究其原因:
原来类的静态成员在初始化时如果出现异常,访问类的其它静态成员或对该类进行初始化都会抛出这个异常。
总结:
TypeInitializationExeption在MSND中的描述为:当类初始值设定项不能初始化类型时,将创建 TypeInitializationException 并向其传递由该类型的类初始值设定项引发的异常引用。
我们知道,类型初始化或者访问类型的静态成员时,都会对类中的其他静态成员进行初始化,并执行静态构造函数(如果有的话)。在这些过程中如果任一环节出现例如下面的代码:
class ClassHelper { public static string Field = Do("Initial the static field"); public static string StaticString = "Initaial static string"; public string NonStaticString = "Initial non static string"; public ClassHelper() { NonStaticString = "Change non static string in instance constructor"; StaticString = "Change static string in instance constructor"; } public static string Do(string field) { Console.WriteLine(field); throw new Exception(); return field; } }
那么产生TypeInitializationException的情况就包含以下几种:
1. 访问类的某一静态成员,而其他静态成员的初始化(或静态构造函数中)产生异常。例如访问ClassHelper.StaticString,由于静态成员Field的初始化产生异常,因此调用ClassHelper.StaticString会抛出TypeInitializationException。
2. 访问类的某一静态成员,该静态成员的初始化(或静态构造函数中)产生异常。例如访问ClassHelper.Field。
3. 对该类进行初始化,而类中的某个静态成员初始化(或静态构造函数中)产生异常。例如ClassHelper helper = new ClassHelper()。
参考自:姚琪琳的类型初始值设定项引发异常一文,特此鸣谢!