Freigeben über


CA1065: Keine Ausnahmen an unerwarteten Speicherorten auslösen.

Eigenschaft Wert
Regel-ID CA1065
Titel Keine Ausnahmen an unerwarteten Stellen auslösen.
Kategorie Design
Fix führt zu Unterbrechungen oder bleibt funktionsfähig Untrennbar
Standardmäßig in .NET 10 aktiviert Nein
Anwendbare Sprachen C# und Visual Basic

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 Ereignis-Accessoren
  • Equals-Methoden
  • GetHashCode-Methoden
  • ToString-Methoden
  • Statische Konstruktoren
  • Finalizeren
  • Methoden zur Entsorgung
  • 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. Daher sollten sie sich möglichst wie ein Feld verhalten. Da Felder keine Ausnahmen auslösen, sollte diese auch für Eigenschaften gelten. Wenn eine Eigenschaft eine Ausnahme auslöst, sollten Sie erwägen, sie in eine Methode umzuwandeln.

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. Wenn Sie versuchen, einen Event-Handler hinzuzufügen oder zu entfernen, sollte ein Ereignis keine Ausnahme auslösen.

Die folgenden Ausnahmen können von einer Ereigniszugriffsmethode ausgelöst werden:

Equals-Methoden

Für die folgenden Equals-Methoden sollten keine Ausnahmen ausgelöst werden:

Eine Equals Methode sollte true oder false zurückgeben, anstatt eine Ausnahme auszulösen. Wenn beispielsweise Equals zwei nicht übereinstimmende Typen übergeben werden, sollte einfach false zurückgegeben werden, anstatt eine ArgumentException auszulösen.

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.

Versionen von GetHashCode, die ein Argument annehmen, können ein ArgumentException werfen. Allerdings sollte Object.GetHashCode niemals eine Ausnahme auslösen.

ToString-Methoden

Der Debugger verwendet System.Object.ToString, 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, eine Ausnahme in einem statischen Konstruktor auszulösen.

Finalizeren

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.

Methoden zur Entsorgung

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 von Dispose, dass der Benutzer die Ausnahmebehandlung innerhalb der finally Klausel hinzufügt.

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 zurückgeben und 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 unerwartet. Für Operatoren für die implizite Umwandlung sollten daher keine Ausnahmen ausgelöst werden.

So beheben Sie Verstöße

Ä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ß durch eine Ausnahmedeklaration anstelle einer ausgelösten Ausnahme verursacht wurde, kann die Unterdrückung einer Warnung nach dieser Regel sicher erfolgen.

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 auf none in der Konfigurationsdatei fest.

[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch