Abfangen und Auslösen von Standardausnahmetypen
Aktualisiert: November 2007
Die folgenden Richtlinien beschreiben die empfohlenen Vorgehensweisen für einige der am häufigsten verwendeten Ausnahmen, die von .NET Framework bereitgestellt werden. Eine vollständige Liste der vom Framework bereitgestellten Ausnahmeklassen finden Sie in der Referenz zur .NET Framework-Klassenbibliothek-Dokumentation.
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.");
}
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;
}
}
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 aufgerufen 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 im Buch "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries" von Krzysztof Cwalina und Brad Abrams, veröffentlicht von Addison-Wesley, 2005.
Siehe auch
Konzepte
Auswählen des richtigen Typs der auszulösenden Ausnahme