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

對於C#中異常:「The type initializer to throw an exception(類型初始值設定項引起異常)」的簡單分析,目前本人分析兩種狀況,以下:html

狀況一:web

  借鑑麒麟.NET類型初始值設定項引起異常文章!!!寫的很詳細,你們能夠看一看!sql

其實麒麟.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(類型初始值設定項引起異常)」異常,這是由於靜態成員的性質決定的,具體關於靜態,你們能夠網上看看!這裏不詳細描述各類狀況的一一舉例,推薦的這篇就有詳細描述!這裏就直接歸納一下!ide

解決方法:函數

既然上面已經指出了拋異常的本質,那麼咱們就能夠一步一步的去追蹤異常的產生點了,經過設斷點,F11去調試,若是有的看不了,那麼具體操做例子看狀況二,我遇到的狀況及解決。post

 

狀況二:ui

  具體的內容並無寫,而不是靜態成員實例化所直接致使的,咱們來一步一步分析與解決。url

運行個人項目是產生異常("Bingosoft.Data.DaoFactory"的類型初始值設定項引起異常)以下:spa

網頁中拋出的異常信息:

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

這裏我項目是在公司開發框架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!此次就成功了(這裏就不截圖了,項目涉及公司內容,抱歉!但個人的確確是運行成功了~~)

 

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

因爲技術有限,但願你們理解包含,多多指導~~

若是寫的有缺陷很差的,你們評論中指出,我會修改的,謝謝~~

更多知識分享:微笑空間站

相關文章
相關標籤/搜索