天天看點

聊聊.net中的異常處理

在.net中,異常是跨語言的,意思就是在VB.NET中抛的異常是在C#中可以捕捉到的。這個是怎麼作到的呢?如果要了解,還得從異常的基礎說起,就從C#中異常處理開始吧。

1、Exception

Exception是所有異常類的父類,這個類沒有什麼特别的,唯一不同的就是在.net中指定了它是所有異常的基類。這個類從object派生,并且繼承了ISerializable,_Exception兩個接口,ISerializable是實作序列化的接口的,_Exception是一個異常的接口。

2、throw

throw是一個專門的關鍵字,他的唯一作用就在某些時候把Exception本身或子類的對象抛出來——也即為抛異常中(其實在這裡是抛一個對象,這個對象封裝了不符合邏輯規範或業務規範的資訊),某些時候是什麼時候呢?比如,在資料運算中,用0作為整數的被除數是不符合規範的,是以在c#中去表達這個算法的時候也是不可以的。比如在現實業務中,比如出現一個本月工資為負數的工資數,這也是不現實的,這些都是可以作為抛出異常的理由。

3、try…catch…finally

抛出了異常,誰來處理呢?肯定得有一些關鍵字來處理,即try…catch…finally。具體代碼為:

try

{

}

catch

finally

在try語句塊中,是書寫語句的地方,是以也是引發異常的地方。如果整個語句塊區域内沒有發生異常,則不執行catch,如果try的語句塊中發生異常,剛會執行catch語句塊。finally語句塊是無論異常是否發生,都會執行的。

Catch可以加上一個參數:

catch(Exception e)

這個參數就是捕獲在try語句裡的異常而抛出來的,其實Exception是throw傳給catch的一個參數對象,這個對象中封裝着異常資訊。

對時catch語句塊可以有多個,并且都得有參數,但是有一定的序順,是先Excepation的子類,再到Exception。

以上就是基本的異常處理規則,下面來簡單看一個這三者組合。

定義異常   

class DataQueryException : Exception//異常類

    {       

        string condition;//定義查詢條件

        public string Condition

        {

            get { return condition; }

            set { condition = value; }

        }

        public DataQueryException(string message)

            : base(message)

        {         

        public DataQueryException(string message, string condition)

            this.condition = condition;

  按照業務邏輯來抛出異常

   class BLL//業務類

    {

        public string QueryName(string condition)

            if (condition == "" || condition == null)

            {

                throw new DataQueryException("輸入的條件為null或\"\"");

            }

            if (condition.Length > 20)

                throw new DataQueryException("條件的長度大于20",condition);

            //查代碼

            return "查詢結果";

    }

應用業務類型,捕捉異常

    class Program//應用業務類

        static void Main(string[] args)

            try

                BLL bll = new BLL();

                bll.QueryName("");

            catch (DataQueryException dqe)

                Console.WriteLine("異常資訊:"+dqe.Message+" 查詢條件:"+dqe.Condition );

            catch (Exception dqe)

                Console.WriteLine("異常資訊:" + dqe.Message);

以上代碼全用C#實作的,假設定義異常是用C++.net來實作,在另外的兩個類中需要是引用一下。

業務類是用VB.NET來實作。應用業務類用c#實作,當然,如果要用業務定義的一些類,則必須引入業務類。這樣的話,異常類,定義完後,根本不知道什麼類要用自己。對于業務類來說,我隻知道不滿足我的業務邏輯時,就會throw出異常,但不知道抛給誰。調用業務類知道的最全面,調用那個類,引發何種異常,全了解才可以。

從上面可以看出,其實這個異常處理已經實作了跨語言了。當然,這個是從開發人員角度去認識的。如果從IL角度看,其實這些處理都是在IL級别來完成的。

本文轉自桂素偉51CTO部落格,原文連結:http://blog.51cto.com/axzxs/357217,如需轉載請自行聯系原作者

繼續閱讀