| 屬性 | 值 |
|---|---|
| 規則識別碼 | CA2201 |
| 職稱 | 不要引發保留的例外狀況類型 |
| 類別 | 使用方式 |
| 修正是造成中斷還是不中斷 | 中斷 |
| 在 .NET 10 中預設啟用 | 否 |
| 適用語言 | C# 與 Visual Basic |
原因
方法會引發過於一般或被執行時期保留的例外狀況類型。
規則描述
下列例外狀況類型太一般,無法為使用者提供足夠的資訊:
下列例外狀況類型是保留的,而且應該只由 Common Language Runtime 擲回:
- System.AccessViolationException
- System.ExecutionEngineException
- System.IndexOutOfRangeException
- System.NullReferenceException
- System.OutOfMemoryException
- System.Runtime.InteropServices.COMException
- System.Runtime.InteropServices.ExternalException
- System.Runtime.InteropServices.SEHException
- System.StackOverflowException
不要拋出一般例外狀況
如果您在連結庫或架構中擲回一般例外狀況類型,例如 Exception 或 SystemException,它會強制取用者攔截所有例外狀況,包括不知道如何處理的未知例外狀況。
相反地,請拋出已存在於架構中的衍生型別,或者創建衍生自 Exception 的自有型別。
拋出特定例外狀況
下表顯示針對各種無效自變數類型擲回的例外狀況,包括 屬性存取 set 子中的 value 參數。
| 無效引數 | 例外狀況 |
|---|---|
null 參考 |
ArgumentNullException |
| 超出允許的值範圍(例如集合或清單的索引) | ArgumentOutOfRangeException |
無效 enum 的值 |
InvalidEnumArgumentException |
包含不符合方法參數規格的格式(例如的 ToString(String)格式字串) |
FormatException |
| 否則無效 | ArgumentException |
下表顯示針對各種無效作業類型,應擲回哪些例外狀況。
| 作業無效 | 例外狀況 |
|---|---|
| 作業對物件的目前狀態無效。 | InvalidOperationException |
| 作業會在已處置的物件上執行。 | ObjectDisposedException |
此操作不受支援(例如,在為讀取而開啟的數據流中被覆寫的 Stream.Write 中)。 |
NotSupportedException |
| 轉換會導致溢位(例如在明確的轉換運算元多載中)。 | OverflowException |
針對所有其他情況,請考慮建立一個衍生自 Exception 的您自己的類別,並擲回它。
如何修正違規
若要修正此規則違規,請將擲回的例外狀況類型變更為不屬於保留類型的一個特定類型。
Example
// This code violates the rule.
throw new Exception();
throw new NullReferenceException();
throw new IndexOutOfRangeException();
// ...
// This code satisfies the rule.
throw new ArgumentException();
throw new ArgumentNullException();
throw new InvalidOperationException();
// ...
// A minimal implementation of inheritance from Exception
public class CustomException : Exception { }
// Or create your own type that derives from Exception
// This code satisfies the rule too.
throw new CustomException();
隱藏警告的時機
請勿隱藏此規則的警告。