C#中異常:“The type initializer to throw an exception(類型初始值設定項引發異常)”的簡單分析與解決方案

來源:互聯網
上載者:User

標籤:

對於C#中異常:“The type initializer to throw an exception(類型初始值設定項引發異常)”的簡單分析,目前本人分析兩種情況,如下:

情況一:

  借鑒麒麟.NET的類型初始值設定項引發異常文章!!!寫的很詳細,大家可以看一看!

其實麒麟.NET的這篇文章主要講解分析了靜態成員的方面,總的說就是:類型初始化或訪問類型的靜態成員時,都會對類中的其他靜態成員進行初始化,如果有靜態建構函式的話,一併執行靜態建構函式。在這過程中所引發的異常我就直接借鑒麒麟.NET的例子了:

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;        }    }
View Code

產生TypeInitializationException的情況歸結就是,在靜態成員執行個體化時,只要前後有靜態成員執行個體化時拋出異常,那麼整個程式運行時也就會產生如題的“The type initializer to throw an exception(類型初始值設定項引發異常)”異常,這是因為靜態成員的性質決定的,具體關於靜態,大家可以網上看看!這裡不詳細描述各種情況的一一舉例,推薦的這篇就有詳細描述!這裡就直接概括一下!

解決方案:

既然上面已經指出了拋異常的本質,那麼我們就可以一步一步的去追蹤異常的產生點了,通過設斷點,F11去調試,如果有的看不了,那麼具體操作例子看情況二,我遇到的情況及解決。

 

情況二:

  具體的內容並沒有寫,而不是靜態成員執行個體化所直接導致的,我們來一步一步分析與解決。

運行我的項目是產生異常("Bingosoft.Data.DaoFactory"的類型初始值設定項引發異常)如下:

網頁中拋出的異常資訊:

以上也是我們正常分析所拋出異常的一般步驟,在網頁中我們得到了異常源,我們就來分析情況一在此有沒有可能???

這裡我項目是在公司開發架構KissU.Net的基礎上做的,很多東西都很封閉,我們看不到內部的方法實現,所以我們通過VS去分析相應的dll檔案,又拋出的異常資訊,我們可以看出是Bingosoft.Data.dll檔案中拋出的異常,那麼我們就到項目下References中找到Bingosoft.Data.dll,雙擊開啟:

由網頁中拋出的異常資訊圖中的“異常間接產生點”我們定位於位置:

由此結合網頁中的異常資訊,我們可以推斷出異常的本質還是靜態成員執行個體化是所導致的,但值得注意的是,這隻是間接的導致,異常的直接導致原因,我們可以在網頁異常資訊中看出“InvalidOperationException”已經給了我們提示,所以我們從本質入手。

解決方案:

‘key‘ attribute must has a value of command in ‘E:\VSProjects2010\Bingosoft.ProjectDemo\Bingosoft.ProjectDemo\Bingosoft.ProjectDemo.WebApp
\App_Config\SqlCommands\Subway\Subway.SqlServer.config‘中指出了Subway.SqlServer.config檔案必須有一個command值,我們來看下這個檔案!
<?xml version="1.0" encoding="utf-8"?><configuration>    <system.web>    </system.web></configuration>
View Code

看看項目中相似的一個檔案內容:

<?xml version="1.0" encoding="utf-8" ?><commands xmlns="http://schemas.bingosoft.net/netframework/sqlcommand">  <!-- 使用者資訊列表  -->  <command key="demo.user.list">    <![CDATA[      select Id Id,Name Name,LoginId LoginId,Sex Sex,        (case when Sex = ‘M‘ then ‘男‘ when Sex = ‘F‘ then ‘女‘ else ‘‘ end) SexName,        Birthday Birthday, OrgId OrgId,          (select Name from SEC_Organization where id = su.OrgId) DeptName       from Sec_User su      where 1=1       {? AND Name = #UserName# }      {? AND LoginId = #LoginId#}        ]]>  </command>......</commands>
View Code

原來是在項目中新加個功能模組Subway,結果Subway.SqlServer.config檔案並沒有配置,那麼這個項目架構運行時,把所有被指檔案都解析了一遍,自然而然也就解析了這個檔案,所以異常也就發生了。本來我是想這個模組不開發的,對整個項目運行是沒有影響的,但事實證明這個架構是要把所有的.config都解析的,所以出乎意料的,異常發生了。

既然知道了,我們就可以著手了,給他添加個空的command,不就行了,再看Subway.SqlServer.config檔案

<?xml version="1.0" encoding="utf-8"?><!--<configuration>    <system.web>    </system.web></configuration>--><commands xmlns="http://schemas.bingosoft.net/netframework/sqlcommand">  <command key="example">    <![CDATA[......]]>  </command></commands>
View Code

重新Rebuild下Solution,再次運行本項目,OK!這次就成功了(這裡就不了,項目涉及公司內容,抱歉!但我的的確確是運行成功了~~)

 

好了,今天就寫到這裡~~

由於技術有限,希望大家理解包含,多多指導~~

如果寫的有缺陷不好的,大家評論中指出,我會修改的,謝謝~~

 

 

 

C#中異常:“The type initializer to throw an exception(類型初始值設定項引發異常)”的簡單分析與解決方案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.