請勿在未預期的位置引發例外狀況
更新:2007 年 11 月
型別名稱 |
DoNotRaiseExceptionsInUnexpectedLocations |
CheckId |
CA1065 |
分類 |
Microsoft.Design |
中斷變更 |
非中斷 |
原因
不可擲回例外狀況 (Exception) 的方法卻擲回例外狀況。
規則描述
不可擲回例外狀況的方法可以分成下列幾類:
Property Get 方法
事件存取子方法
Equals 方法
GetHashCode 方法
ToString 方法
靜態建構函式 (Constructor)
完成項
Dispose 方法
等號比較運算子
隱含轉型運算子
下列章節會討論這些方法類型。
Property Get 方法
屬性基本上是智慧型欄位。因此,應該讓屬性的行為盡量類似欄位。欄位不會擲回例外狀況,所以屬性也不能擲回例外狀況。如果某個屬性會擲回例外狀況,請考慮將它變成方法。
可以從 Property Get 方法擲回的例外狀況包括:
System.InvalidOperationException 和所有系出物件 (包括 System.ObjectDisposedException)
System.NotSupportedException 和所有系出物件
System.ArgumentException (只能從索引 Get 擲回)
KeyNotFoundException (只能從索引 Get 擲回)
事件存取子方法
事件存取子應該是不允許擲回例外狀況的簡單作業。事件不可在嘗試加入或移除事件處理常式時擲回例外狀況。
可從事件存取子擲回的例外狀況包括:
System.InvalidOperationException 和所有系出物件 (包括 System.ObjectDisposedException)
System.NotSupportedException 和所有系出物件
ArgumentException 和系出物件
Equals 方法
下列 Equals 方法不可擲回例外狀況:
Equals 方法應該傳回 true 或 false,而不是擲回例外狀況。例如,如果將兩個不相符的型別傳遞到 Equals,它應該只會傳回 false,而不會擲回 ArgumentException。
GetHashCode 方法
下列 GetHashCode 方法通常不可擲回例外狀況:
GetHashCode 必須傳回值,否則,您可能會遺失雜湊資料表中的項目。
可接受引數的 GetHashCode 版本可以擲回 ArgumentException。不過,Object.GetHashCode 絕對不可擲回例外狀況。
ToString 方法
偵錯工具使用 Object.ToString,以字串格式顯示物件相關資訊。因此,ToString 不應該變更物件的狀態,也不可擲回例外狀況。
靜態建構函式
從靜態建構函式傳回例外狀況,將使型別無法在目前的應用程式定義域中使用。除非有非常充分的理由 (例如安全性問題),否則請勿從靜態建構函式擲回例外狀況。
完成項
從完成項擲回例外狀況將使 CLR 執行失敗,而導致處理序終止。因此,請務必避免在完成項中擲回例外狀況。
Dispose 方法
IDisposable.Dispose 或 [M:System.IDisposable.Dispose(bool disposing)] 方法不可擲回例外狀況。Dispose 通常是在 finally 子句的清除邏輯中一併呼叫。因此,從 Dispose 明確擲回例外狀況將會強制使用者在 finally 子句中加入例外處理 (Exception Handling)。
Dispose(false) 程式碼路徑絕對不可擲回例外狀況,因為這個路徑幾乎都是從完成項呼叫。
等號比較運算子 (==、!=)
就像 Equals 方法一樣,等號比較運算子應該傳回 true 或 false,而不可擲回例外狀況。
隱含轉型運算子
因為使用者通常不會察覺到已經呼叫了隱含轉型運算子,所以完全不會預期到隱含轉型運算子擲回的例外狀況。因此,您不可從隱含轉型運算子擲回任何例外狀況。
如何修正違規
對於屬性 getter,請變更邏輯使它不再需要擲回例外狀況,或是將屬性變更為方法。
對於先前列出的所有其他方法型別,請變更邏輯使它不再需要擲回例外狀況。
隱藏警告的時機
如果違規是因例外狀況宣告而非擲回例外狀況所造成,則您可以放心地隱藏這項規則的警告。