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 9 aktiviert No

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;
        }
    }
}

CA2200: Erneut ausführen, um Stapeldetails beizubehalten.