Share via


CA1064: Exceções devem ser públicas

Property Valor
ID da regra CA1064
Título Exceções devem ser públicas
Categoria Projetar
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

Uma exceção não pública deriva diretamente de Exception, SystemException ou ApplicationException.

Descrição da regra

Uma exceção interna somente é visível dentro do próprio escopo interno. Depois que a exceção falha fora do escopo interno, somente a exceção de base pode ser usada para capturar a exceção. Se a exceção interna for herdada de Exception, SystemException ou ApplicationException, o código externo não terá informações suficientes para saber o que fazer com a exceção.

Mas, se o código tiver uma exceção pública que mais tarde será usada como base para uma exceção interna, é razoável supor que o código mais distante será capaz de fazer algo inteligente com a exceção base. A exceção pública terá mais informações do que as fornecidas por Exception, SystemException ou ApplicationException.

Como corrigir violações

Tornar a exceção pública ou derivar a exceção interna de uma exceção pública que não seja Exception, SystemException ou ApplicationException.

Quando suprimir avisos

Suprima uma mensagem dessa regra se tiver certeza em todos os casos de que a exceção privada será capturada dentro do próprio escopo interno.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

#pragma warning disable CA1064
// The code that's violating the rule is on this line.
#pragma warning restore CA1064

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA1064.severity = none

Para obter mais informações, confira Como suprimir avisos de análise de código.

Exemplo

Essa regra é acionada no primeiro método de exemplo, FirstCustomException, porque a classe de exceção deriva diretamente de Exception e é interna. A regra não é acionada na classe SecondCustomException porque, embora a classe também derive diretamente de Exception, a classe é declarada pública. A terceira classe também não aciona a regra porque ela não deriva diretamente de System.Exception, System.SystemException ou System.ApplicationException.

// Violates this rule
[Serializable]
internal class FirstCustomException : Exception
{
    internal FirstCustomException()
    {
    }

    internal FirstCustomException(string message)
        : base(message)
    {
    }

    internal FirstCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    protected FirstCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

// Does not violate this rule because
// SecondCustomException is public
[Serializable]
public class SecondCustomException : Exception
{
    public SecondCustomException()
    {
    }

    public SecondCustomException(string message)
        : base(message)
    {

    }

    public SecondCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    protected SecondCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

// Does not violate this rule because
// ThirdCustomException it does not derive directly from
// Exception, SystemException, or ApplicationException
[Serializable]
internal class ThirdCustomException : SecondCustomException
{
    internal ThirdCustomException()
    {
    }

    internal ThirdCustomException(string message)
        : base(message)
    {
    }

    internal ThirdCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }


    protected ThirdCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}