CA1065: Keine Ausnahmen an unerwarteten Speicherorten auslösen.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1065 |
Titel | Keine Ausnahmen an unerwarteten Speicherorten auslösen. |
Kategorie | Design |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 9 aktiviert | No |
Ursache
Eine Methode, von der das Auslösen von Ausnahmen nicht erwartet wird, löst eine Ausnahme aus.
Regelbeschreibung
Methoden, für die keine Auslösung von Ausnahmen erwartet wird, können wie folgt kategorisiert werden:
- Methoden zum Abrufen von Eigenschaften
- Methoden für den Ereignisaccessor
- Gleich Methoden
- GetHashCode-Methoden
- ToString-Methoden
- Statische Konstruktoren
- Finalizer
- Dispose-Methoden
- Gleichheitsoperatoren
- Implizite Umwandlungsoperatoren
In den folgenden Abschnitten werden diese Arten von Methoden beschrieben.
Methoden zum Abrufen von Eigenschaften
Bei Eigenschaften handelt es sich im Grunde genommen um intelligente Felder. Also sollten sie sich möglichst auch wie ein Feld verhalten. Da Felder keine Ausnahmen auslösen, sollte diese auch für Eigenschaften gelten. Wenn bei Ihnen eine Eigenschaft eine Ausnahme auslöst, sollten Sie erwägen, diese in eine Methode zu ändern.
Für eine Property Get-Methode können die folgenden Ausnahmen ausgelöst werden:
- System.InvalidOperationException und alle Ableitungen (einschließlich System.ObjectDisposedException)
- System.NotSupportedException und alle Ableitungen
- System.ArgumentException (nur über indizierten get-Vorgang)
- System.Collections.Generic.KeyNotFoundException (nur über indizierten get-Vorgang)
Methoden für den Ereignisaccessor
Bei Ereigniszugriffsmethoden sollte es sich um einfache Vorgänge handeln, bei denen keine Ausnahmen ausgelöst werden. Von einem Ereignis sollte keine Ausnahme ausgelöst werden, wenn Sie versuchen, einen Ereignishandler hinzuzufügen oder zu entfernen.
Für eine Ereigniszugriffsmethode können die folgenden Ausnahmen ausgelöst werden:
- System.InvalidOperationException und alle Ableitungen (einschließlich System.ObjectDisposedException)
- System.NotSupportedException und alle Ableitungen
- System.ArgumentException und Ableitungen
Gleich Methoden
Für die folgenden Equals-Methoden sollten keine Ausnahmen ausgelöst werden:
Eine Equals
Methode sollte zurückgeben true
oder false
nicht eine Ausnahme auslösen. Wenn beispielsweise Equals
zwei nicht übereinstimmende Typen übergeben werden, sollte sie nur zurückgegeben false
werden, anstatt eine ArgumentException.
GetHashCode-Methoden
Die folgenden GetHashCode
Methoden sollten in der Regel keine Ausnahmen auslösen:
GetHashCode
sollte immer einen Wert zurückgeben. Andernfalls kann es zu einem Verlust von Elementen kommen, die in der Hashtabelle enthalten sind.
Die Versionen, die GetHashCode
ein Argument annehmen, können ein ArgumentException. Object.GetHashCode
Allerdings sollte niemals eine Ausnahme ausgelöst werden.
ToString-Methoden
Für den Debugger wird System.Object.ToString verwendet, um Informationen zu Objekten im Zeichenfolgenformat anzuzeigen. ToString
Daher sollte der Status eines Objekts nicht geändert werden, und es sollten keine Ausnahmen ausgelöst werden.
Statische Konstruktoren
Die Auslösung von Ausnahmen über einen statischen Konstruktor bewirkt, dass der Typ in der aktuellen Anwendungsdomäne unbrauchbar ist. Sie sollten einen triftigen Grund (z. B. ein Sicherheitsproblem) dafür haben, die Auslösung einer Ausnahme für einen statischen Konstruktor zuzulassen.
Finalizer
Das Auslösen einer Ausnahme über einen Finalizer führt dazu, dass für die Common Language Runtime sofort ein Fehler auftritt und der Prozess nicht erfolgreich ist. Vermeiden Sie daher das Auslösen von Ausnahmen in einem Finalizer.
Dispose-Methoden
Für eine System.IDisposable.Dispose-Methode sollte keine Ausnahme ausgelöst werden. Dispose
wird häufig als Teil der Bereinigungslogik in einer finally
Klausel aufgerufen. Daher erzwingt das explizite Auslösen einer Ausnahme Dispose
vom Benutzer, die Ausnahmebehandlung innerhalb der finally
Klausel hinzuzufügen.
Der Dispose(false)
Codepfad sollte niemals Ausnahmen auslösen, da Dispose
fast immer von einem Finalizer aufgerufen wird.
Gleichheitsoperatoren (==, !=)
Wie Equals
Methoden sollten Gleichheitsoperatoren entweder true
oder false
, und sollten keine Ausnahmen auslösen.
Implizite Umwandlungsoperatoren
Da dem Benutzer häufig nicht bewusst ist, dass ein Operator für eine implizite Umwandlung aufgerufen wurde, ist eine von diesem Operator ausgelöste Ausnahme ein unerwartetes Verhalten. Für Operatoren für die implizite Umwandlung sollten daher keine Ausnahmen ausgelöst werden.
Behandeln von Verstößen
Ändern Sie für Property Get-Vorgänge entweder die Logik, damit keine Ausnahme mehr ausgelöst werden muss, oder ändern Sie die Eigenschaft in eine Methode.
Ändern Sie für alle anderen obigen Methodentypen die Logik so, dass keine Ausnahme mehr ausgelöst werden muss.
Wann sollten Warnungen unterdrückt werden?
Falls der Verstoß nicht durch die Auslösung einer Ausnahme, sondern durch eine Ausnahmedeklaration verursacht wurde, kann eine Warnung dieser Regel problemlos unterdrückt werden.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.