Abfangen und Auslösen von Standardausnahmetypen

Die folgenden Richtlinien beschreiben die empfohlenen Vorgehensweisen für einige der am häufigsten verwendeten Ausnahmen, die von .NET Framework bereitgestellt werden.

Exception und SystemException

Lösen Sie System.Exception oder System.SystemException nicht aus.

Fangen Sie System.Exception oder System.SystemException nicht in Frameworkcode ab, es sei denn, Sie möchten die Ausnahme erneut auslösen.

Fangen Sie System.Exception oder System.SystemException nur in Ausnahmehandlern der obersten Ebene ab.

ApplicationException

Leiten Sie benutzerdefinierte Ausnahmen eher als die T:System.ApplicationException-Klasse von der T:System.Exception-Klasse ab.

Ursprünglich wurde davon ausgegangen, dass benutzerdefinierte Ausnahmen von der ApplicationException-Klasse abgeleitet werden sollten. In der Praxis hat sich dies jedoch nicht als bedeutender Vorteil erwiesen. Weitere Informationen finden Sie unter Empfohlene Vorgehensweise für die Ausnahmebehandlung.

InvalidOperationException

Lösen Sie eine System.InvalidOperationException-Ausnahme aus, wenn ein ungeeigneter Zustand vorliegt. System.InvalidOperationException sollte ausgelöst werden, wenn einer festgelegten Eigenschaft oder einem Methodenaufruf nicht ordnungsgemäß der aktuelle Zustand des Objekts zugewiesen wurde. Beispielsweise sollte das Schreiben in einen System.IO.FileStream, der zum Lesen geöffnet wurde, eine System.InvalidOperationException-Ausnahme auslösen.

Diese Ausnahme sollte auch ausgelöst werden, wenn der kombinierte Zustand eines Satzes verwandter Objekte für die Operation ungültig ist.

ArgumentException, ArgumentNullException und ArgumentOutOfRangeException

Lösen Sie System.ArgumentException oder einen Untertypen davon aus, wenn ungültige Argumente an einen Member übergeben werden. Verwenden Sie nach Möglichkeit den Ausnahmetyp mit den meisten Ableitungen.

Im folgenden Codebeispiel wird das Auslösen einer Ausnahme veranschaulicht, wenn ein Argument null (Nothing in Visual Basic) ist.

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.");
}
if (anObject == nullptr)
{
    throw gcnew ArgumentNullException("anObject",
        "Specify a non-null argument.");
}

Legen Sie die System.ArgumentException.ParamName-Eigenschaft fest, wenn Sie System.ArgumentException oder einen davon abgeleiteten Typen auslösen. Diese Eigenschaft speichert den Namen des Parameters, der das Auslösen der Ausnahme verursacht hat. Beachten Sie, dass die Eigenschaft mit einer der Konstruktorüberladungen festgelegt werden kann.

Verwenden Sie als Name des impliziten Wertparameters von Eigenschaftensettern value.

Im folgenden Codebeispiel wird eine Eigenschaft veranschaulicht, die eine Ausnahme auslöst, wenn der Aufrufer ein NULL-Argument übergibt.

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;
    }
}
property IPAddress^ Address
{
    IPAddress^ get()
    {
        return address;
    }
    void set(IPAddress^ value)
    {
        if (value == nullptr)
        {
            throw gcnew ArgumentNullException("value");
        }
        address = value;
    }
}

Lassen Sie nicht zu, dass öffentlich aufrufbare APIs explizit oder implizit System.NullReferenceException, System.AccessViolationException, System.InvalidCastException oder System.IndexOutOfRangeException auslösen. Führen Sie eine Argumentüberprüfung aus, um das Auslösen dieser Ausnahmen zu vermeiden. Durch das Auslösen dieser Ausnahmen werden Implementierungsdetails der Methode verfügbar gemacht, die sich im Lauf der Zeit ändern können.

StackOverflowException

Lösen Sie System.StackOverflowException nicht explizit aus. Diese Ausnahme sollte nur von der Common Language Runtime (CLR) explizit ausgelöst werden.

Fangen Sie System.StackOverflowException nicht ab.

Es ist äußerst schwierig, einen Stapelüberlauf programmgesteuert zu behandeln. Lassen Sie das Beenden des Prozesses durch diese Ausnahme zu, und bestimmen Sie durch Debuggen die Quelle des Problems.

OutOfMemoryException

Lösen Sie System.OutOfMemoryException nicht explizit aus. Diese Ausnahme sollte nur von der CLR-Infrastruktur ausgelöst werden.

ComException und SEHException

Lösen Sie System.Runtime.InteropServices.COMException oder System.Runtime.InteropServices.SEHException nicht explizit aus. Diese Ausnahmen sollten nur von der CLR-Infrastruktur ausgelöst werden.

Fangen Sie System.Runtime.InteropServices.SEHException nicht explizit ab.

ExecutionEngineException

Lösen Sie System.ExecutionEngineException nicht explizit aus.

Copyright für einzelne Teile 2005 Microsoft Corporation. Alle Rechte vorbehalten.

Copyright für einzelne Teile Addison-Wesley Corporation. Alle Rechte vorbehalten.

Weitere Informationen zu Entwurfsrichtlinien finden Sie unter „Framework-Entwurfs-Richtlinien: Idiome, Konventionen und Muster für wiederverwendbare .NET-Bibliotheken von Krzysztof Cwalina“ book und Brad Abrams, veröffentlicht von Addison-Wesley, 2005.

Siehe auch

Konzepte

Auswählen des richtigen Typs der auszulösenden Ausnahme

Weitere Ressourcen

Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken

Entwurfsrichtlinien für Ausnahmen