Keine Ausnahmen an unerwarteten Speicherorten auslösen
Aktualisiert: November 2007
TypeName |
DoNotRaiseExceptionsInUnexpectedLocations |
CheckId |
CA1065 |
Kategorie |
Microsoft.Design |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Eine Methode, von der das Auslösen von Ausnahmen nicht erwartet wird, löst eine Ausnahme aus.
Regelbeschreibung
Methoden, von denen das Auslösen von Ausnahmen nicht erwartet wird, können in folgende Kategorien unterteilt werden:
Property Get-Methoden
Ereignisaccessormethoden
Equals-Methoden
GetHashCode-Methoden
ToString-Methoden
Statische Konstruktoren
Finalizer
Dispose-Methoden
Gleichheitsoperatoren
Implizite Umwandlungsoperatoren
In den folgenden Abschnitten werden diese Methodentypen erläutert.
Property Get-Methoden
Eigenschaften sind im Grunde intelligente Felder. Daher sollten sie so weit wie möglich das Verhalten eines Feldes aufweisen. Genausowenig wie Felder sollten Eigenschaften Ausnahmen auslösen. Wenn Sie über eine Eigenschaft verfügen, die eine Ausnahme auslöst, sollten Sie in Erwägung ziehen, sie in eine Methode umzuwandeln.
Die folgenden Ausnahmen dürfen von einer Property Get-Methode ausgelöst werden:
System.InvalidOperationException und alle Ableitungen (einschließlich System.ObjectDisposedException)
System.NotSupportedException und alle Ableitungen
System.ArgumentException (nur von Get-Methoden)
KeyNotFoundException (nur von Get-Methoden)
Ereignisaccessormethoden
Ereignisaccessoren sollten einfache Operationen sein, die keine Ausnahmen auslösen. Ein Ereignis sollte beim Versuch, einen Ereignishandler hinzuzufügen oder zu entfernen, keine Ausnahme auslösen.
Die folgenden Ausnahmen dürfen von einem Ereignisaccessor ausgelöst werden:
System.InvalidOperationException und alle Ableitungen (einschließlich System.ObjectDisposedException)
System.NotSupportedException und alle Ableitungen
ArgumentException und Ableitungen
Equals-Methoden
Die folgenden Equals-Methoden sollten keine Ausnahmen auslösen:
Eine Equals-Methode sollte true oder false zurückgeben, statt eine Ausnahme auszulösen. Wenn an Equals beispielsweise zwei Typen übergeben werden, die einen Konflikt verursachen, sollte die Methode einfach false zurückgeben und keine ArgumentException auslösen.
GetHashCode-Methoden
Die folgenden GetHashCode-Methoden sollten normalerweise keine Ausnahmen auslösen:
GetHashCode sollte immer einen Wert zurückgeben. Andernfalls können Elemente in der Hashtabelle verloren gehen.
Die Versionen von GetHashCode, die ein Argument akzeptieren, können eine ArgumentException auslösen. Object.GetHashCode sollte jedoch niemals eine Ausnahme auslösen.
ToString-Methoden
Der Debugger verwendet Object.ToString, um die Anzeige von Objektinformationen im Zeichenfolgenformat zu unterstützen. Deshalb sollte ToString weder den Zustand eines Objekts ändern noch eine Ausnahme auslösen.
Statische Konstruktoren
Wenn ein statischer Konstruktor eine Ausnahme auslöst, wird der Typ in der aktuellen Anwendungsdomäne unbrauchbar. Ausnahmen sollten nur, falls unbedingt erforderlich, von einem statischen Konstruktor ausgelöst werden (beispielsweise bei einem Sicherheitsproblem).
Finalizer
Das Auslösen einer Ausnahme durch einen Finalizer bewirkt, dass die CLR unverzüglich einen Fehler verursacht und der Prozess beendet wird. Daher sollte stets vermieden werden, dass ein Finalizer Ausnahmen auslöst.
Dispose-Methoden
Eine IDisposable.Dispose-Methode oder [M:System.IDisposable.Dispose(bool disposing)]-Methode sollte keine Ausnahme auslösen. Dispose wird häufig als Teil der Bereinigungslogik in einer finally-Klausel aufgerufen. Daher wird der Benutzer durch das explizite Auslösen einer Ausnahme von Dispose gezwungen, eine Ausnahmebehandlung innerhalb der finally-Klausel hinzuzufügen.
Der Dispose(false)-Codepfad sollte nie eine Ausnahme auslösen, da er fast immer von einem Finalizer aufgerufen wird.
Gleichheitsoperatoren (==, !=)
Gleichheitsoperatoren sollten genauso wie Equals-Methoden entweder true oder false zurückgeben und keine Ausnahmen auslösen.
Implizite Umwandlungsoperatoren
Da dem Benutzer häufig nicht bewusst ist, dass ein impliziter Umwandlungsoperator aufgerufen wurde, tritt eine durch den impliziten Umwandlungsoperator ausgelöste Ausnahme völlig unerwartet auf. Deshalb sollten keine Ausnahmen von impliziten Umwandlungsoperatoren ausgelöst werden.
Behandlung von Verstößen
Bearbeiten Sie bei Eigenschaftengettern entweder die Logik, damit keine Ausnahme mehr ausgelöst werden muss, oder ändern Sie die Eigenschaft in eine Methode.
Ändern Sie bei allen anderen oben aufgeführten Methodentypen die Logik, damit keine Ausnahme mehr ausgelöst werden muss.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn der Verstoß durch eine Ausnahmedeklaration anstelle einer ausgelösten Ausnahme verursacht wurde.
Verwandte Regeln
Keine Ausnahmen in Ausnahmeklauseln auslösen