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