Dela via


CA1031: Fånga inte allmänna undantagstyper

Property Värde
Regel-ID CA1031
Title Fånga inte allmänna undantagstyper
Kategori Designa
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 9 Nej

Orsak

Ett allmänt undantag som System.Exception eller System.SystemException fångas i en catch instruktion eller en allmän catch-sats som catch() används.

Som standard flaggar den här regeln endast allmänna undantagstyper som fångas, men detta kan konfigureras.

Regelbeskrivning

Allmänna undantag bör inte fångas.

Så här åtgärdar du överträdelser

Åtgärda ett brott mot den här regeln genom att fånga ett mer specifikt undantag eller återaktivera det allmänna undantaget som den sista instruktionen catch i blocket.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln. Att fånga allmänna undantagstyper kan dölja körningsproblem från biblioteksanvändaren och göra felsökningen svårare.

Kommentar

Från och med .NET Framework 4 levererar common language runtime (CLR) inte längre skadade tillståndsundundentag som inträffar i operativsystemet och hanterad kod, till exempel åtkomstöverträdelser i Windows, som ska hanteras av hanterad kod. Om du vill kompilera ett program i .NET Framework 4 eller senare versioner och upprätthålla hanteringen av skadade tillståndsfel kan du använda HandleProcessCorruptedStateExceptionsAttribute attributet för den metod som hanterar undantaget för skadat tillstånd.

Konfigurera kod för analys

Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.

Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som gäller för eller för alla regler i den här kategorin (design) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Otillåtna undantagstypnamn

Du kan konfigurera vilka undantagstyper som inte tillåts att fångas. Om du till exempel vill ange att regeln ska flagga catch hanterare med NullReferenceExceptionlägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException

Format för tillåtna typnamn i alternativvärdet (avgränsat med |):

  • Skriv endast namn (innehåller alla symboler med namnet, oavsett vilken typ eller namnrymd som finns)
  • Fullständigt kvalificerade namn i symbolens dokumentations-ID-format med ett T: prefix.

Exempel:

Alternativvärde Sammanfattning
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType Matchar alla symboler med namnet "ExceptionType" i kompilering.
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 Matchar alla symboler med namnet "ExceptionType1" eller "ExceptionType2" i kompilering.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType Matchar specifika typer med namnet "ExceptionType" med det angivna fullständigt kvalificerade namnet.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 Matchar typerna "ExceptionType1" och "ExceptionType2" med respektive fullständigt kvalificerade namn.

Du kan konfigurera dessa alternativ för just den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (design) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Exempel

I följande exempel visas en typ som bryter mot den här regeln och en typ som implementerar catch blocket korrekt.

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: Återväxt för att bevara stackinformation