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ée par défaut dans .NET 9 | 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)
{
}
}