Delen via


CA1031: Algemene uitzonderingstypen niet vangen

Eigenschappen Weergegeven als
Regel-id CA1031
Titel Algemene uitzonderingstypen niet ondervangen
Categorie Ontwerpen
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Nee

Oorzaak

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

Deze regel markeert standaard alleen algemene uitzonderingstypen die worden gevangen, maar dit kan worden geconfigureerd.

Beschrijving van regel

Algemene uitzonderingen mogen niet worden betrapt.

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 common language runtime (CLR) geen beschadigde statusuitzonderingen meer die optreden in het besturingssysteem en beheerde code, zoals toegangsschendingen in Windows, die moeten worden verwerkt door beheerde code. 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 zijn toegestaan. Als u bijvoorbeeld wilt opgeven dat de regel handlers moet markerencatch, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw NullReferenceExceptionproject:

dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException

Toegestane typenaamnotaties 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 met de naam 'ExceptionType1' of 'ExceptionType2' in de compilatie.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType Komt overeen met specifieke typen met de naam 'ExceptionType' met een volledig gekwalificeerde naam.
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 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.

Opmerking

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
{
    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: Opnieuw verzamelen om stackdetails te behouden