Partilhar via


CA1064: As exceções devem ser públicas

Propriedade valor
ID da regra CA1064
Cargo As exceções devem ser públicas
Categoria Desenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

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

Descrição da regra

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

Mas, se o código tem uma exceção pública que mais tarde é 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, SystemExceptionou ApplicationException.

Como corrigir violações

Tornar pública a exceção ou derivar a exceção interna de uma exceção pública que não Exceptionseja , SystemExceptionou ApplicationException.

Quando suprimir avisos

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

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

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

Exemplo

Esta 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 dispara a regra porque ela não deriva diretamente de System.Exception, System.SystemExceptionou 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)
    {
    }
}