在.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,如需轉載請自行聯系原作者