Partilhar via


CA1031: Não capturar tipos de exceção gerais

Property valor
ID da regra CA1031
Título Não apanhar tipos de exceção gerais
Categoria Desenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Não

Motivo

Uma exceção geral, como System.Exception ou System.SystemException é apanhada numa catch declaração, ou uma cláusula geral de captura, como catch() é usada.

Por padrão, essa regra sinaliza apenas os tipos de exceção gerais que estão sendo capturados, mas isso é configurável.

Descrição da regra

Não devem ser apanhadas exceções gerais.

Como corrigir violações

Para corrigir uma violação dessa regra, pegue uma exceção mais específica ou relance-a como a última instrução no catch bloco.

Quando suprimir avisos

Não suprima um aviso desta regra. Capturar tipos de exceção gerais pode ocultar problemas de tempo de execução do usuário da biblioteca e pode dificultar a depuração.

Nota

A partir do .NET Framework 4, o Common Language Runtime (CLR) não oferece mais exceções de estado corrompido que ocorrem no sistema operacional e código gerenciado, como violações de acesso no Windows, para ser manipulado por código gerenciado. Se você deseja compilar um aplicativo no .NET Framework 4 ou versões posteriores e manter a manipulação de exceções de estado corrompido, você pode aplicar o HandleProcessCorruptedStateExceptionsAttribute atributo ao método que manipula a exceção de estado corrompido.

Configurar código para análise

Use a opção a seguir para configurar em quais partes da sua base de código executar essa regra.

Você pode configurar essa opção apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Design) às quais ela se aplica. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.

Nomes de tipo de exceção não permitidos

Você pode configurar quais tipos de exceção não podem ser capturados. Por exemplo, para especificar que a regra deve sinalizar catch manipuladores com NullReferenceException, adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:

dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException

Formatos de nome de tipo permitidos no valor da opção (separados por |):

  • Digite apenas o nome (inclui todos os símbolos com o nome, independentemente do tipo ou namespace que o contém)
  • Nomes totalmente qualificados no formato de ID de documentação do símbolo com um T: prefixo.

Exemplos:

Valor da opção Resumo
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType Corresponde a todos os símbolos chamados 'ExceptionType' na compilação.
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 Corresponde a todos os símbolos chamados 'ExceptionType1' ou 'ExceptionType2' na compilação.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType Corresponde a tipos específicos chamados 'ExceptionType' com um nome totalmente qualificado.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 Corresponde aos tipos chamados 'ExceptionType1' e 'ExceptionType2' com os respetivos nomes totalmente qualificados.

Você pode configurar essas opções apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Design) às quais ela se aplica. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.

Exemplo

O exemplo a seguir mostra um tipo que viola essa regra e um tipo que implementa corretamente o catch bloco.

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: Relançar para preservar os detalhes da pilha