CA1064: Exceções devem ser públicas
TypeName |
ExceptionsShouldBePublic |
CheckId |
CA1064 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Não separável |
Causa
Uma exceção não-públicos deriva diretamente de Exception, SystemException, ou ApplicationException.
Descrição da regra
Uma exceção interna só é visível dentro de seu próprio escopo interno. Depois que a exceção cair fora do escopo interno, a base de exceção pode ser usado para capturar a exceção. Se a exceção interna é herdada da 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 tem uma exceção pública que posteriormente é usada como base para uma exceção interna, é razoável presumir que o código ainda mais check-out será capaz de fazer algo inteligente com a exceção de base. A exceção pública terão mais informações do que o que é fornecido pelo T:System.Exception, T:System.SystemException ou T:System.ApplicationException.
Como corrigir violações
Publique a exceção ou derivar a exceção interna de uma exceção de pública que não é Exception, SystemException, ou ApplicationException.
Quando suprimir avisos
Suprimir a uma mensagem de que essa regra se tiver certeza em todos os casos que a exceção particular será detectada em seu próprio escopo interno.
Exemplo
Essa regra é acionado no método primeiro exemplo, FirstCustomException, porque a classe de exceção deriva diretamente de exceção e é interna. A regra não será acionado na classe SecondCustomException, porque embora a classe também deriva diretamente a partir de exceção, a classe é declarada pública. Terceira classe também disparar a regra porque ela não é derivada diretamente de System.Exception, System.SystemException, ou System.ApplicationException.
using System;
using System.Runtime.Serialization;
namespace Samples
{
// 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)
{
}
}
}