Partilhar via


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

Property valor
ID da regra CA1064
Título 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 10 Não

Motivo

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, SystemExceptionou 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 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)
    {
    }
}