使用者定義例外是指你在程式碼中定義、且衍生自System.Exception的任何類別。它遵循類別繼承的所有規則,但除此之外,編譯器和語言執行階段還會以特殊方式對待這類類別,讓它們的執行個體可以在正常控制流程之外被擲回和攔截,這在exceptions練習中討論過。使用者定義例外可以像執行階段例外和 Microsoft Base Class Library 例外一樣,以各種方式使用。
這種特殊對待只適用於衍生自Exception的類別。你無法擲回其他任何型別的執行個體。
使用者定義例外經常被用來攜帶額外資訊,例如訊息和其他相關資料,讓負責攔截的常式能夠取用。這些資訊接著可以記錄到日誌中、回報給使用者,或者用於重試操作。System.Exception具備便利的資料成員和適當的建構函式,可保存訊息和「內部」例外。
依照慣例,例外類別名稱會以「Exception」結尾,例如MyTerribleException。
雖然使用使用者定義例外來包裝並強化第三方的例外是常見的模式,但一般建議是,除了這個用途之外,不要在自家程式碼中過度使用它們。這被視為一種反模式。有人對這個觀點提出質疑,你可以在這篇 Stack Exchange 文章 中看到正反兩方的論點。
這篇文章是使用者定義例外很好的入門介紹。
.NET 團隊在建立與擲回例外的指導方針中,建議使用者定義例外要有一些便利建構函式。對多數用途而言,下面示範的組合就很合適喔。
public class IncompleteExerciseException : System.Exception
{
public IncompleteExerciseException() : base() { }
public IncompleteExerciseException(string message) : base(message) { }
public IncompleteExerciseException(string message, System.Exception inner) : base(message, inner) { }
}