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