CA1064 : Les exceptions doivent être publiques

Propriété Value
Identificateur de la règle CA1064
Titre Les exceptions doivent être publiques
Catégorie Conception
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

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

Description de la règle

Une exception interne est visible uniquement à l’intérieur de sa propre étendue 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’a pas d’informations suffisantes pour savoir que faire avec l’exception.

Toutefois, si le code a une exception publique qui est utilisée ultérieurement comme base pour une exception interne, il est raisonnable de supposer que le code plus loin sera en mesure de faire quelque chose d’intelligent avec l’exception de base. L’exception publique aura davantage d’informations que ce qui est fourni par Exception, SystemException ou ApplicationException.

Comment corriger les violations

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

Quand supprimer les avertissements

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

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA1064
// The code that's violating the rule is on this line.
#pragma warning restore CA1064

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA1064.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemple

Cette règle se déclenche sur le premier exemple de méthode, FirstCustomException, car la classe d’exception dérive directement d’Exception et est interne. La règle ne se déclenche pas sur la classe SecondCustomException, car bien que la classe dérive également directement d’Exception, elle est déclarée publique. La troisième classe ne déclenche pas non plus la règle, car elle ne dérive pas directement de System.Exception, System.SystemException ou System.ApplicationException.

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