【轉】型別初始值設定項引發異常
轉自: http://www.cnblogs.com/kirinboy/archive/2007/11/07/951903.html
-上午開啟VS編譯程式的時候,突然出現了這個執行時錯誤“型別初始值設定項引發異常”。昨天還沒有這個錯誤呢,今天就突然出現,搞得我一頭霧水。上網搜了一下,發現有很多人遇到了這個問題。經過一番折騰解決了這個問題後,發現很多人都沒有意識到其癥結所在,於是寫這個隨筆,給大家點啟發,也給自己做個備忘。
症狀描述:
我的程式需要連線一臺MQ伺服器(其實就是個桌上型電腦,每天下班關機),如果伺服器沒有開,程式就會丟擲異常。以前編譯時老是忘開伺服器,經常會出現MQ訪問失敗的異常。這次我原本以為也是這個異常,沒想到出來的是“
今天的錯誤為什麼會和以往不一樣呢?昨天臨下班時,把一個類的單件模式做了重構,使用了靜態初始化方法。程式碼如下:
private static readonly WorkerManager instance = new WorkerManager(); static WorkerManager() { } private WorkerManager() { Initialize(); } public static WorkerManager Instance { get { return instance; } }
訪問MQ的語句在Initialize方法裡,問題就應該出現在這裡了。
解決方法:
當然,把MQ伺服器開啟問題就解決了,但是究竟為什麼會出現“型別初始值設定項引發異常”呢?
原來類的靜態成員在初始化時如果出現異常,訪問類的其它靜態成員或對該類進行初始化都會丟擲這個異常。請看下面的程式碼:
public class Test { public static Foo Test1 = new Foo(); public static string Test2 = "Test2"; public string Test3 = "Test3"; public Test() { } } public class Foo { public Foo() { throw new Exception(); } }
在訪問Test.Test2以及new Test()時都會丟擲這個異常。我的程式碼中,由於Initialize()出現異常,instance例項化失敗,所以訪問Instance時就丟擲了這個異常。
總結:
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()。