Share via


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 8 aktiviert Nein

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:

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:

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. Disposewird häufig als Teil der sauber uplogik 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.

Siehe auch