CA1064: as exceções devem ser públicas
TypeName |
ExceptionsShouldBePublic |
CheckId |
CA1064 |
Categoria |
Microsoft.Design |
Alteração Significativa |
Sem Quebra |
Causa
Uma exceção do utilitário não tem origem diretamente de Exception, de SystemException, ou de ApplicationException.
Descrição da Regra
Uma exceção interna é visível somente em seu próprio escopo interno.Depois que a exceção está fora do escopo interno, somente a exceção de base pode ser usada para capturar a exceção.Se a exceção interna é herdada de Exception, de SystemException, ou de ApplicationException, o código externo não terá informações suficientes para saber o que fazer com que a exceção.
Mas, se o código tem uma exceção pública que é usada posteriormente como base para uma exceção interna é razoável, suponha que o código mais out poderá fazer algo inteligente com a exceção de base.A exceção pública terá mais informações do que é fornecido por T: System.Exception, T: System.SystemException, ou T: System.ApplicationException.
Como Corrigir Violações
Faça o utilitário de exceção, ou derivar a exceção interna da exceção pública que não é Exception, SystemException, ou ApplicationException.
Quando Suprimir Alertas
Suprimir uma mensagem dessa regra se você tiver certeza em todos os casos que a exceção privada será capturada em seu próprio escopo interno.
Exemplo
Esta regra é acionado no primeiro método de exemplo, FirstCustomException porque a classe de exceção se deriva diretamente a exceção e se é interna.A regra não é acionado na classe de SecondCustomException como embora a classe também deriva diretamente de exceção, a classe é declarada utilitário.A terceira classe também não é acionado como se a regra não deriva diretamente de Exception, de SystemException, ou de 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)
{
}
}
}