Compartilhar via


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