类型初始值设定项引发异常

今天在使用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()。

参考自:姚琪琳的类型初始值设定项引发异常一文,特此鸣谢!

  

  

posted @ 2012-03-15 22:27  新爱  阅读(1522)  评论(0编辑  收藏  举报