CA1031: Allgemeine Ausnahmetypen nicht auffangen.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1031 |
Titel | Allgemeine Ausnahmetypen nicht auffangen. |
Kategorie | Design |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
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.
Behandeln von Verstößen
Fangen Sie eine spezifischere Ausnahme ab, oder lösen Sie die allgemeine Ausnahme in der letzten Anweisung des catch
-Blocks erneut aus, um den Verstoß gegen diese Regel zu behandeln.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel. Durch das Abfangen allgemeiner Ausnahmetypen können Laufzeitprobleme beim Bibliotheksbenutzer ausgeblendet und das Debugging erschwert werden.
Hinweis
Ab .NET Framework 4 werden von der Common Language Runtime (CLR) keine beschädigten Zustandsausnahmen mehr bereitgestellt, die im Betriebssystem auftreten, sowie kein verwalteter Code mehr, z. B. Zugriffsverletzungen in Windows, die von verwaltetem Code behandelt werden. 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 |
Entspricht bestimmten Typen mit dem Namen „ExceptionType“ mit dem angegebenen vollqualifizierten Namen. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Entspricht den Typen „ExceptionType1“ und „ExceptionType2“ mit den entsprechenden vollqualifizierten Namen |
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.
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
{
FileStream? inStream;
FileStream? outStream;
public GenericExceptionsCaught(string inFile, string outFile)
{
try
{
inStream = File.Open(inFile, FileMode.Open);
}
catch (SystemException)
{
Console.WriteLine("Unable to open {0}.", inFile);
}
try
{
outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine("Unable to open {0}.", outFile);
}
}
}
public class GenericExceptionsCaughtFixed
{
FileStream? inStream;
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 {0}.", 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 {0}.", outFile);
throw;
}
}
}