異常
在異常發生時,將自上而下地搜尋匹配的catch快,因此,我們應將較具體的異常放在上面,即最常用的異常型別應首先出現,
接著是這些型別的基礎型別(如果存在的話),最後是system.exception異常。
例子:private void somemethod()
catch(invalidoperationexception)
catch(ioexception)
catch //catch(exception)
finally
}例項:
private void readdata(string pathname)
catch(ioexception)
finally}}
2、定義自己的異常類
定義異常類是的注意事項:
1、定義乙個派生自system.exception的自己的異常類是,異常類的語義一定要精確匹配,包要丟擲system.exception的異常。
2、計畫為異常型別的構造器傳遞什麼樣的字串訊息?字串要包含為何無法完成任務
例項:假設我們頂乙個方法,該方法接收物件的引用,而物件的型別必須實現iformattable介面和icomparable介面:
internal sealed class sometype
//操作物件o...}}
missinginte***ceeception是自定義的乙個異常類,在定義異常類時,我們可以從sytem.exception繼承,也可以從他具體的子類
繼承,如果定義的異常類不作為其他類的父類,應該將該型別標記為sealed。
exception基礎型別定義了4個標準構造器:
1、乙個公共的無參構造器(預設),它建立乙個異常型別的例項,並將所有的字段和屬性設為預設值。
2、乙個公共的含有連個引數的構造器(引數的型別為string),他建立了乙個異常型別的實力,並設定乙個指定的訊息。
3、乙個公共的含有兩個引數的構造器(其中乙個引數的型別string,另乙個引數為派生自exception型別的例項),他建立了乙個異常型別的實力,並設定乙個指定的訊息和乙個內部異常。
4、乙個受保護的含有兩個引數的構造器(其中乙個引數為serializationinfo,另乙個引數為streamingcontext),他反序列化派生自exception物件的例項。注意,如果派生自exception的型別是密封的,那麼這個方法的可訪問性應為private,並且確保該構造器在基類中條用相同的構造器,一邊基類的字段被真正地反序列化。
要使乙個新定義的異常序列化,需要練個步驟:首先,要對型別應用乙個[serializable]自定義屬性;
接著,還要實現iseriallizable介面及其getobjiectdata方法(該方法用喲乙個securitypermission屬性)
和乙個構造器,兩者都有連個引數,即serializationinfo和streamingcontext.
例項**:
using system;
using system.text;
using system.runtime.serialization;
using system.security.permission;
//允許diskfullexception的例項被序列化
[serialiable]
public sealed class diskfullexception : exception, iserializable
}//為了包含字段,重寫屬性message(如果已經設定的話)
public override string message}}
//三個公共構造器方法
public diskfullexception() : base() {}
public diskfullexception(string message) : base(message) {}
public diskfullexception(string message, exception innerexception) : base(message, innerexception) {}
//定義乙個額外的構造器,設定新定義的字段
public diskfullexception(string message, string diskpath) : this(message)
public diskfullexception(string message, string diskpath, exception innerexception)
: this (message, innerexception)
//定義乙個反序列化的構造器,因為雷士密封的,所以該構造器是私有的;否則,該構造器可以是受保護的
private diskfullexception(serializationinfo info, streamingcontext context) : base(into, context)
//定義序列化方法:securitypermission確保呼叫者後的物件的內部狀態
[securitypermission(securityaction.demand, serializationformatter = true)]
public override void getobjectdata(serializationinfo info, streamingcontext context)
}
C 異常筆記
1.通常異常都是捕捉,然後處理或拋 try catch exception ex 可優化為 try catch 2.捕捉異常不處理可不加catch,這樣能提公升效能 try finally 3.異常捕捉錯誤的行數 int index ex.stacktrace.indexof 行號 if index...
C 異常學習筆記
vc 中的異常捕獲的規則 可以捕獲的異常有以下三種情況 1.必須嚴格遵守匹配資料型別 2.異常處理的資料型別是公有類,拋擲的異常的資料型別是派生類。3.異常處理的資料型別是指向公有基類的指標,拋擲異常的資料型別是指向派生類的執針 對於派生層次結構的異常處理,catch 塊組的順序是重要的。因為 ca...
c 異常學習筆記
1.捕獲異常 try catch結構 2.收尾工作 try catch finally結構 3.丟擲異常 throw語句 try catch finally結構 class program denominator,result catch dividebyzeroexception e 分母為0的異...