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 | CA1031 |
| Titel | Fange keine allgemeinen Fehlertypen ab. |
| 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 allgemeine Ausnahme, z. B. System.Exception oder System.SystemException, wird in einer catch-Anweisung abgefangen, oder es wird eine allgemeine Catch-Klausel wie catch() verwendet.
Standardmäßig markiert diese Regel nur allgemeine Ausnahmetypen, die abgefangen werden, dies ist jedoch konfigurierbar.
Regelbeschreibung
Allgemeine Ausnahmen sollten nicht abgefangen werden.
So beheben Sie Verstöße
Um einen Verstoß gegen diese Regel zu beheben, fangen Sie eine spezifischere Ausnahme ab oder werfen Sie die allgemeine Ausnahme als letzte Anweisung im catch-Block erneut.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel. Das Abfangen allgemeiner Ausnahmetypen kann Laufzeitprobleme vom Bibliotheksbenutzer ausblenden und das Debuggen erschweren.
Hinweis
Ab .NET Framework 4 liefert die Common Language Runtime (CLR) keine beschädigten Zustandsausnahmen mehr, die sowohl im Betriebssystem als auch im verwalteten Code auftreten, wie z. B. Zugriffsverletzungen in Windows, zur Behandlung durch verwalteten Code. Wenn Sie eine Anwendung in .NET Framework 4 oder höheren Versionen kompilieren und die Behandlung von beschädigten Zustandsausnahmen beibehalten möchten, können Sie das HandleProcessCorruptedStateExceptionsAttribute-Attribut auf die Methode anwenden, die die Corrupted State Exception behandelt.
Konfigurieren des zu analysierenden Codes
Mithilfe der folgenden Option können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.
Sie können diese Optionen nur für diese Regel, für alle zutreffenden Regeln oder für alle zutreffenden Regeln in dieser Kategorie (Entwurf) konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.
Unzulässige Namen von Ausnahmetypen
Sie können konfigurieren, welche Ausnahmetypen nicht abgefangen werden dürfen. Sie können beispielsweise festlegen, dass die Regel catch-Handler mit NullReferenceException markieren soll, indem Sie einer .editorconfig-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzufügen:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Zulässige Formate für Typnamen im Optionswert (durch | getrennt):
- Nur Typname (schließt alle Symbole mit dem Namen ein, unabhängig vom enthaltenden Typ oder Namespace)
- Vollqualifizierte Namen im Dokumentations-ID-Format des Symbols mit einem
T:-Präfix.
Beispiele:
| Optionswert | Zusammenfassung |
|---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Entspricht allen Symbolen mit dem Namen „ExceptionType“ in der Kompilierung |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
Entspricht allen Symbolen entweder mit dem Namen „ExceptionType1“ oder „ExceptionType2“ in der Kompilierung |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Vergleicht spezifische Typen mit dem Namen „ExceptionType“ anhand des angegebenen vollqualifizierten Namens. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Entspricht den Typen „ExceptionType1“ und „ExceptionType2“, jeweils mit ihren entsprechenden vollqualifizierten Namen. |
Sie können diese Optionen nur für diese Regel konfigurieren, für alle Regeln, auf die sie angewendet werden, oder für alle Regeln auf die sie in dieser Kategorie (Entwurf) angewendet werden. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.
Beispiel
Das folgende Beispiel zeigt einen Typ, der gegen diese Regel verstößt, und einen Typ, der den catch-Block ordnungsgemäß implementiert.
Imports System
Imports System.IO
Namespace ca1031
' Creates two violations of the rule.
Public Class GenericExceptionsCaught
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
Catch ex As SystemException
Console.WriteLine("Unable to open {0}.", inFile)
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
Catch
Console.WriteLine("Unable to open {0}.", outFile)
End Try
End Sub
End Class
Public Class GenericExceptionsCaughtFixed
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
' Fix the first violation by catching a specific exception.
Catch ex As FileNotFoundException
Console.WriteLine("Unable to open {0}.", inFile)
' For functionally equivalent code, also catch the
' remaining exceptions that may be thrown by File.Open
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
' Fix the second violation by re-throwing the generic
' exception at the end of the catch block.
Catch
Console.WriteLine("Unable to open {0}.", outFile)
Throw
End Try
End Sub
End Class
End Namespace
// Creates two violations of the rule.
public class GenericExceptionsCaught
{
private readonly FileStream? _inStream;
private readonly FileStream? _outStream;
public GenericExceptionsCaught(string inFile, string outFile)
{
try
{
_inStream = File.Open(inFile, FileMode.Open);
}
catch (SystemException)
{
Console.WriteLine($"Unable to open {inFile}.");
}
try
{
_outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine($"Unable to open {outFile}.");
}
}
}
public class GenericExceptionsCaughtFixed
{
private readonly FileStream? _inStream;
private readonly FileStream _outStream;
public GenericExceptionsCaughtFixed(string inFile, string outFile)
{
try
{
_inStream = File.Open(inFile, FileMode.Open);
}
// Fix the first violation by catching a specific exception.
catch (FileNotFoundException)
{
Console.WriteLine($"Unable to open {inFile}.");
}
// For functionally equivalent code, also catch
// remaining exceptions that may be thrown by File.Open
try
{
_outStream = File.Open(outFile, FileMode.Open);
}
// Fix the second violation by rethrowing the generic
// exception at the end of the catch block.
catch
{
Console.WriteLine($"Unable to open {outFile}.");
throw;
}
}
}