Delen via


CA1031: Algemene uitzonderingstypen niet vangen

Eigenschap Waarde
Regel-id CA1031
Titel Vang geen algemene uitzonderingstypen op
Categorie Ontwerpen
Oplossing is wel of niet brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Een algemene uitzondering zoals System.Exception of System.SystemException wordt gevangen in een catch verklaring, of een algemene catch-clausule zoals catch() wordt gebruikt.

Standaard markeert deze regel alleen algemene uitzonderingstypen die worden afgevangen, maar dit is aanpasbaar.

Beschrijving van regel

Algemene uitzonderingen mogen niet worden betrapt.

Hoe schendingen oplossen

U kunt een schending van deze regel oplossen door een specifiekere uitzondering te ondervangen of de algemene uitzondering opnieuw te werpen als de laatste instructie in het catch blok.

Wanneer waarschuwingen onderdrukken

Een waarschuwing van deze regel niet onderdrukken. Het opsporen van algemene uitzonderingstypen kan runtimeproblemen van de bibliotheekgebruiker verbergen en kan foutopsporing moeilijker maken.

Notitie

Vanaf .NET Framework 4 levert de common language runtime (CLR) geen beschadigde statusuitzonderingen meer die optreden in het besturingssysteem en beheerde code, zoals toegangsschendingen in Windows, die door de beheerde code moeten worden verwerkt. Als u een toepassing in .NET Framework 4 of hoger wilt compileren en de verwerking van beschadigde status-uitzonderingen wilt behouden, kunt u het HandleProcessCorruptedStateExceptionsAttribute kenmerk toepassen op de methode waarmee de beschadigde status-uitzondering wordt verwerkt.

Code configureren om te analyseren

Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.

U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (ontwerp) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.

Namen van uitzonderingstypen zijn niet toegestaan

U kunt configureren welke uitzonderingstypen niet mogen worden opgevangen. Als u bijvoorbeeld wilt aangeven dat de regel handlers moet markeren met NullReferenceException, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException

Toegestane typenaamformaten in de optiewaarde (gescheiden door |):

  • Typ alleen de naam (inclusief alle symbolen met de naam, ongeacht het type of de naamruimte)
  • Volledig gekwalificeerde namen in de documentatie-ID-indeling van het symbool met een T: voorvoegsel.

Voorbeelden:

Optiewaarde Samenvatting
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType Komt overeen met alle symbolen met de naam 'ExceptionType' in de compilatie.
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 Komt overeen met alle symbolen die de naam 'ExceptionType1' of 'ExceptionType2' hebben in de compilatie.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType Komt overeen met specifieke typen die de naam 'ExceptionType' hebben en waarvan de naam volledig gekwalificeerd is.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 Komt overeen met typen met de naam 'ExceptionType1' en 'ExceptionType2' met respectievelijke volledig gekwalificeerde namen.

U kunt deze opties configureren voor alleen deze regel, voor alle regels waarop ze van toepassing zijn, of voor alle regels in deze categorie (Ontwerp) waarop ze van toepassing zijn. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.

Voorbeeld

In het volgende voorbeeld ziet u een type dat deze regel schendt en een type dat het catch blok correct implementeert.

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

CA2200: Opnieuw verzamelen om stackdetails te behouden