共用方式為


攔截和擲回標準例外狀況類型

更新:2007 年 11 月

下列方針將描述 .NET Framework 提供的一些最常用之例外狀況的最佳作法。如需 Framework 提供的例外狀況類別之完整清單,請參閱 .NET Framework 類別庫參考文件。

例外狀況和 SystemException

請不要擲回 System.Exception 或 System.SystemException。

請不要攔截 Framework 程式碼中的 System.Exception 或 System.SystemException,除非您要重新擲回。

避免攔截 System.Exception 或 System.SystemException,但是在最上層例外處理常式中除外。

ApplicationException

請從 T:System.Exception 類別中衍生自訂例外狀況,不要從 T:System.ApplicationException 類別中衍生。

原本認為自訂例外狀況應該要從 ApplicationException 類別衍生,但是,這麼做並不會新增重要值。如需詳細資訊,請參閱處理例外狀況的最佳作法

InvalidOperationException

如果是在不適當的狀態下,則要擲回 System.InvalidOperationException 例外狀況。如果在給定物件的目前狀態下,屬性集或方法呼叫並不適當,則應該擲回 System.InvalidOperationException。例如,寫入到已經開啟來讀取的 System.IO.FileStream 的動作應該會擲回 System.InvalidOperationException 例外狀況。

當一組相關物件的結合狀態對此作業無效時,也應該擲回此例外狀況。

ArgumentException、ArgumentNullException 和 ArgumentOutOfRangeException

如果將錯誤的引數傳遞給成員,則要擲回 System.ArgumentException 或它的一個子型別。會優先使用最具衍生性的例外狀況型別 (如果適用的話)。

下列程式碼範例會示範在引數為 null (Visual Basic 中為 Nothing) 時,擲回例外狀況。

If (anObject = Nothing) Then
    Throw New ArgumentNullException("anObject", "Specify a non-null argument.")
End If
if (anObject == null)
{
    throw new ArgumentNullException("anObject",
        "Specify a non-null argument.");
}

當擲回 System.ArgumentException 或它的一個衍生型別 (Derived Type) 時,要設定 System.ArgumentException.ParamName 屬性;這個屬性會儲存造成此例外狀況擲回的參數名稱。請注意,可以使用其中一個建構函式 (Constructor) 多載來設定這個屬性。

要使用屬性 setter 的隱含值參數名稱的值。

下列程式碼範例將示範在呼叫端傳遞 null 引數時,擲回例外狀況的屬性。

Public Property Address() As IPAddress
    Get
        Return IPaddr
    End Get
    Set(ByVal value As IPAddress)
        If IsNothing(value) Then
            Throw New ArgumentNullException("value")
        End If
        IPaddr = value
    End Set
End Property
public IPAddress Address
{
    get
    {
        return address;
    }
    set
    {
        if(value == null)
        {
            throw new ArgumentNullException("value");
        }
        address = value;
    }
}

不要允許可公開呼叫的 API 可明確或隱含擲回 System.NullReferenceException、System.AccessViolationException、System.InvalidCastException 或 System.IndexOutOfRangeException;要執行引數檢查來避免擲回這些例外狀況。擲回這些例外狀況會暴露可能隨時間而變更之方法的實作細節。

StackOverflowException

不要明確擲回 System.StackOverflowException,應該只能由 Common Language Runtime (CLR) 明確擲回此例外狀況。

不要攔截 System.StackOverflowException。

以程式設計方式處理堆疊溢位是極為困難的工作;您應該允許此例外狀況結束處理序,並使用偵錯來判斷問題的來源。

OutOfMemoryException

不要明確擲回 System.OutOfMemoryException,應該只能由 CLR 基礎結構來擲回此例外狀況。

ComException 和 SEHException

不要明確擲回 System.Runtime.InteropServices.COMException 或 System.Runtime.InteropServices.SEHException,應該只能由 CLR 基礎結構來擲回這些例外狀況。

不要明確攔截 System.Runtime.InteropServices.SEHException。

ExecutionEngineException

不要明確擲回 System.ExecutionEngineException。

Portions Copyright 2005 Microsoft Corporation.All rights reserved.

Portions Copyright Addison-Wesley Corporation.All rights reserved.

如需設計方針的詳細資訊,請參閱由 Krzysztof Cwalina 和 Brad Abrams 所著,並由 Addison-Wesley 於 2005 年發行的「Framework 設計方針:可重複使用之 .NET 程式庫的慣例、慣用語法和模式」一書。

請參閱

概念

選擇要擲回的正確例外狀況類型

其他資源

開發類別庫的設計方針

例外狀況的設計方針