Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| 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:
- 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. 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:
- System.InvalidOperationException und alle Ableitungen (einschließlich System.ObjectDisposedException)
- System.NotSupportedException und alle Ableitungen
- System.ArgumentException und Derivate
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.