聊聊.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)
            : base(message)
        {
            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級別來完成的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章