Partager via


CA1064 : Les exceptions doivent être publiques

TypeName

ExceptionsShouldBePublic

CheckId

CA1064

Catégorie

Microsoft.CSharp

Modification avec rupture

Modification sans rupture

Cause

Une exception non publique dérive directement de Exception, SystemExceptionou de ApplicationException.

Description de la règle

Une exception interne est uniquement visible à l'intérieur de sa propre portée interne.Lorsque l'exception se situe en dehors de la portée interne, seule l'exception de base peut être utilisée pour intercepter l'exception.Si l'exception interne est héritée de Exception, SystemException ou ApplicationException, le code externe n'aura pas d'informations suffisantes pour savoir que faire avec l'exception.

Mais, si le code a une exception publique utilisée ultérieurement comme base pour une exception interne, vous pouvez considérer que le code plus externe sera en mesure de faire quelque chose d'intelligent avec l'exception de base.L'exception publique aura plus d'informations que ce qui est fourni par T:System.Exception, T:System.SystemException ou T:System.ApplicationException.

Comment corriger les violations

Rendez l'exception publique ou dérivez l'exception interne d'une exception publique qui n'est pas Exception, SystemExceptionou ApplicationException.

Quand supprimer les avertissements

Supprimez un message de cette règle si vous êtes certain dans tous les cas que l'exception privée sera interceptée dans sa propre portée interne.

Exemple

Cette règle se déclenche sur la méthode du premier exemple, FirstCustomException, parce que la classe d'exception dérive directement d'Exception et est interne.La règle ne se déclenche pas sur la classe SecondCustomException parce que, bien que la classe dérive également directement d'Exception, la classe est déclarée publique.La troisième classe ne déclenche pas non plus la règle parce qu'elle ne dérive pas directement de Exception, SystemExceptionou 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)
        {
        }
    }
}