類型初始值設定項引發異常


症狀描述:
  一個bs程序,在程序后台調用一個windows service服務。調用過程中用到了一個靜態方法作為入口,沒想到出來的是“類型初始值設定項引發異常”。無法正常跟蹤卻錯地方。代碼如下:

[HttpGet]
[AllowAnonymous]
public object StartWebCrawler()
{
    MyWindowsServiceHelper.StartMyWindowsService(); return "success";
}
       

//
// GET: /WebResource/Delete/5
public ActionResult StopWebCrawler()
{
    MyWindowsServiceHelper.StopMyWindowsService();
    return View();
}

解決方法:
當然,把MQ服務器打開問題就解決了,但是究竟為什么會出現“類型初始值設定項引發異常”呢?
原來類的靜態成員在初始化時如果出現異常,訪問類的其它靜態成員或對該類進行初始化都會拋出這個異常。請看下面的代碼:

    
public class Test
    {
        public static Fool Test1 = new Fool();
        public static string Test2 = "Test2";
        public string Test3 = "Test3";
        public Test() { }
    }

    public class Fool
    {
        public Fool()
        {
            throw new Exception();
        }
    }

在訪問Test.Test2以及new Test()時都會拋出這個異常。我的代碼中,由於Initialize()出現異常,instance實例化失敗,所以訪問Instance時就拋出了這個異常。

同理,發現自己代碼中錯誤的地方:

public class MyWindowsServiceModel
{
    public string serviceName =     ConfigurationSettings.AppSettings["ServiceName"];
    public string machineName = ConfigurationSettings.AppSettings["MachineName"];        
}

代碼中讀取web.config中的節點錯誤。導致外層使用MyWindowsServiceModel的靜態方法的構造函數中出現錯誤。

 

總結:

  TypeInitializationExeption在MSND中的描述為:當類初始值設定項不能初始化類型時,將創建 TypeInitializationException 並向其傳遞由該類型的類初始值設定項引發的異常引用。

  類型初始化或者訪問類型的靜態成員時,都會對類中的其他靜態成員進行初始化,並執行靜態構造函數(如果有的話)。

那么產生TypeInitializationException的情況就包含以下幾種:

1. 訪問類的某一靜態成員,而其他靜態成員的初始化(或靜態構造函數中)產生異常。例如訪問ClassHelper.StaticString,由於靜態成員Field的初始化產生異常,因此調用ClassHelper.StaticString會拋出TypeInitializationException。

2. 訪問類的某一靜態成員,該靜態成員的初始化(或靜態構造函數中)產生異常。例如訪問ClassHelper.Field。

3. 對該類進行初始化,而類中的某個靜態成員初始化(或靜態構造函數中)產生異常。例如ClassHelper helper = new ClassHelper()。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM