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