exception 類
表示在應用程式執行期間發生的錯誤。
命名空間:system
程式集:mscorlib(在 mscorlib.dll 中)
語法c#
[serializableattribute]
[comvisibleattribute(true)]
[classinte***ceattribute(classinte***cetype.none)]
public
class exception : iserializable, _exception
備註
此類是所有異常的基類。當發生錯誤時,系統或當前正在執行的應用程式通過引發包含關於該錯誤的資訊的異常來報告錯誤。異常發生後,將由該應用程式或缺省異常處理程式進行處理。
公共語言執行庫提供一種異常處理模型,該模型基於物件形式的異常表示形式,並且將程式**和異常處理**分到 try 塊和 catch 塊中。可以有乙個或多個 catch 塊,每個塊都設計為處理一種特定型別的異常,或者將乙個塊設計為捕捉比其他塊更具體的異常。
如果應用程式將處理在執行應用程式**塊期間發生的異常,則**必須放置在 try 語句中。try 語句中的應用程式**是 try 塊。處理由 try 塊引發的異常的應用程式**放在 catch 語句中,稱為 catch 塊。零個或多個 catch 塊與乙個 try 塊相關聯,每個 catch 塊均包含乙個確定該塊處理的異常型別的型別篩選器。
在 try 塊中出現異常時,系統按所關聯 catch 塊在應用程式**中出現的順序搜尋它們,直到定位到處理該異常的 catch 塊為止。如果某 catch 塊的型別篩選器指定 t 或任何派生出 t 的型別,則該 catch 塊處理 t 型別的異常。系統在找到第乙個處理該異常的 catch 塊後即停止搜尋。因此,正如本節後面的示例所演示的那樣,在應用程式**中處理某型別的 catch 塊必須在處理其基型別的 catch 塊之前指定。處理 system.exception 的 catch 塊最後指定。
異常型別支援下面的功能:
基類 exception 下存在兩類異常:
exception 包含很多屬性,可以幫助標識異常的**位置、型別、幫助檔案和原因:stacktrace、innerexception、message、helplink、hresult、source、targetsite 和 data。
當在兩個或多個異常之間存在因果關係時,innerexception 屬性會維護此資訊。作為對此內部異常的反應將引發外部異常。處理外部異常的**可利用以前的內部異常的資訊更妥當地處理錯誤。關於異常的補充資訊可以儲存在 data 屬性中。
應本地化在建立異常物件過程中傳遞給建構函式的錯誤資訊字串,這種字串可以使用 resourcemanager 從資源檔案提供。有關本地化資源的更多資訊,請參見「system.resources 命名空間概述」和「打包和部署資源」。
若要向使用者提供有關異常發生原因的大量資訊,可以使用 helplink 屬性儲存幫助檔案的 url(或 urn)。
exception 使用具有值 0x80131500 的 hresult cor_e_exception。
有關 exception 例項的初始屬性值列表,請參見 exception 建構函式。
效能注意事項
引發或處理異常時,將使用大量的系統資源和執行時間。引發異常只是為了處理確實異常的情況,而不是為了處理可預知的事件或流控制。例如,如果方法引數無效,而應用程式需要使用有效的引數呼叫方法,則可以引發異常。無效的方法引數意味著出現了異常情況。相反,使用者偶爾會輸入無效資料,這是可以預見的,因此如果使用者輸入無效,則不要引發異常。在這種情況下,請提供重試機制以便使用者輸入有效輸入。
僅對特別條件引發異常,然後在應用於大多數應用程式的常規異常處理程式中捕捉異常,而不是在應用於特定異常的處理程式中捕捉異常。此方法的基礎在於,大多數錯誤都可以通過驗證以及與錯誤接近的錯誤處理**進行處理;不需要引發和捕捉異常。通用目的異常處理程式捕捉的是在應用程式任意位置引發的、真正不可預期的異常。
此外,返回**正常時不要引發異常;不要將返回**轉換為異常;也不要例行公事地捕捉異常、忽略異常,然後繼續處理。
示例下面的**示例說明如何定義 catch 塊來處理 arithmeticexception 錯誤。此 catch 塊還捕捉 dividebyzeroexception 錯誤,因為 dividebyzeroexception 從 arithmeticexception 派生,且沒有為 dividebyzeroexception 錯誤顯式定義 catch 塊。
c#
複製**
using system;
class exceptiontestclass
catch (arithmeticexception e)
", e.tostring());
}
catch (exception e)
", e.tostring());
}
} }
c# **的輸出如下所示:
arithmeticexception handler: system.dividebyzeroexception: attempted to divide by zero. at exceptiontestclass.main()
visual basic **的輸出如下所示:
arithmeticexception handler: system.overflowexception: exception of type system.overflowexception was thrown. at exceptiontestclass.main()
繼承層次結構
system.object
system.exception
派生類
發生非致命應用程式錯誤時引發的異常。
命名空間:system
程式集:mscorlib(在 mscorlib.dll 中)
c#
[serializableattribute]
[comvisibleattribute(true)]
public
system.object
system.exception
派生類
設計自定義異常
下列指南有助於確保正確設計您的自定義異常。
避免使用深的異常層次結構。
有關更多資訊,請參見型別和命名空間。
一定要從 system.exception 或其他常見基本異常之一派生異常。
異常類名稱一定要以後綴 exception 結尾。
一致的命名約定有助於降低新庫的學習曲線。
應使異常可序列化。異常必須可序列化才能跨越應用程式域和遠端處理邊界正確工作。
有關使型別可序列化的更多資訊,請參見序列化。
一定要在所有異常上都提供(至少是這樣)下列常見建構函式。確保引數的名稱和型別與在下面的**示例中使用的那些相同。
c#
複製**
public
class newexception : baseexception, iserializable
public newexception(string message)
public newexception(string message, exception inner)
// this constructor is needed for serialization.
protected newexception(serializationinfo info, streamingcontext context)
}
一定要只在要求適合的許可權後,才通過 system.object.tostring 的重寫報告安全敏感資訊。如果許可權要求失敗,則返回乙個不包括安全敏感資訊的字串。
一定要以私有異常狀態儲存有用的安全敏感資訊。請確保只有受信任的**才能獲取該資訊。
考慮提供異常屬性,以便可以以程式設計方式訪問除訊息字串之外與異常相關的額外資訊。
有關設計指南的更多資訊,請參見 krzysztof cwalina 和 brad abrams 編著、addison-wesley 於 2005 年出版的「framework design guidelines: conventions, idioms, and patterns for reusable .net libraries」(《框架設計指南:可重用 .net 庫的約定、術語和模式》)。
C 異常處理
結構化異常 structured exception vs c 異常 c exception 大家都知道c 異常是c 語言的乙個特性,使用者可以使用throw的方式來丟擲異常,try catch 來捕獲異常。結構化異常是諸如,zero divided,access violations等異常,這些異...
c 異常處理
一 概述 c 自身有著非常強的糾錯能力,發展到如今,已經建立了比較完善的異常處理機制。c 的異常情況無非兩種,一種是語法錯誤,即程式中出現了錯誤的語句,函式,結構和類,致使編譯程式無法進行。另一種是執行時發生的錯誤,一般與演算法有關。關於語法錯誤,不必多說,寫 時心細一點就可以解決。c 編譯器的報錯...
C 異常處理
程式設計師常常忽視異常處理的重要性,這給他們自己的 造成相當大損害。本文將討論如何在c 中使用異常處理,並介紹在應用 中新增 片段以防止某些錯誤的一些簡單方法,這些錯誤可能導致程式異常終止。結構化異常處理 net框架提供一種標準的錯誤報告機制稱為結構化異常處理。這種機制依賴於應用中報告錯誤的異常。在...