Ne pas lever d'exceptions dans des emplacements inattendus
Mise à jour : novembre 2007
TypeName |
DoNotRaiseExceptionsInUnexpectedLocations |
CheckId |
CA1065 |
Catégorie |
Microsoft.CSharp |
Modification avec rupture |
Modification sans rupture |
Cause
Une méthode dont l'objet n'est pas de lever des exceptions lève une exception.
Description de la règle
Les méthodes dont l'objet n'est pas de lever des exceptions peuvent être catégorisées comme suit :
Méthodes Property Get
Méthodes d'accesseur d'événement
Méthodes Equals
Méthodes GetHashCode
Méthodes ToString
Constructeurs statiques
Finaliseurs
Méthodes Dispose
Opérateurs d'égalité
Opérateurs de cas implicites
Les sections suivantes traitent de ces types de méthode.
Méthodes Property Get
Les propriétés sont essentiellement des champs intelligents. Elles doivent dès lors agir autant que possible comme un champ. Les champs ne lèvent pas d'exceptions et les propriétés doivent faire de même. Si vous avez une propriété qui lève une exception, envisagez d'en faire une méthode.
Les exceptions suivantes peuvent être levées par une méthode Property Get :
System.InvalidOperationException et tous les dérivés (y compris System.ObjectDisposedException)
System.NotSupportedException et tous les dérivés
System.ArgumentException (uniquement à partir d'Indexed Get)
KeyNotFoundException (uniquement à partir d'Indexed Get)
Méthodes Event Accessor
Les accesseurs d'événement doivent être des opérations simples qui ne lèvent pas d'exceptions. Un événement ne doit pas lever d'exception lorsque vous essayez d'ajouter ou de supprimer un gestionnaire d'événements.
Les exceptions suivantes sont autorisées à être levées à partir d'un accesseur d'événement :
System.InvalidOperationException et tous les dérivés (y compris System.ObjectDisposedException)
System.NotSupportedException et tous les dérivés
ArgumentException et dérivés
Méthodes Equals
Les méthodes Equals suivantes ne doivent pas lever d'exceptions :
Une méthode Equals doit retourner true ou false au lieu de lever une exception. À titre d'exemple, si la méthode Equals est transmise avec deux types incompatibles, elle doit simplement retourner false au lieu de lever une ArgumentException.
Méthodes GetHashCode
Les méthodes GetHashCode suivantes ne doivent pas, habituellement, lever d'exceptions :
GetHashCode doit toujours retourner une valeur. Dans le cas contraire, vous pourriez perdre des éléments de la table de hachage.
Les versions de GetHashCode qui prennent un argument peuvent lever une ArgumentException. Toutefois, Object.GetHashCode ne doit jamais lever d'exception.
Méthodes ToString
Le débogueur utilise Object.ToString pour permettre l'affichage d'informations à propos des objets dans le format de chaîne. Par conséquent, ToString ne doit pas modifier l'état d'un objet et lever d'exceptions.
Constructeurs statiques
Lever les exceptions d'un constructeur statique rend le type inutilisable dans le domaine d'application actuel. Vous devez avoir une très bonne raison (tel qu'un problème de sécurité) pour lever l'exception d'un constructeur statique.
Finaliseurs
Lever l'exception d'un finaliseur entraîne l'échec rapide du CLR, ce qui démonte le processus. Il convient dès lors toujours d'éviter de lever des exceptions dans un finaliseur.
Méthodes Dispose
Une méthode IDisposable.Dispose ou [M:System.IDisposable.Dispose(bool disposing)] ne doit pas lever d'exception. Une méthode Dispose est souvent appelée comme composante de la logique de nettoyage dans une clause finally. Par conséquent, lever explicitement une exception de la méthode Dispose oblige l'utilisateur à ajouter la gestion des exceptions dans la clause finally.
Le chemin d'accès Dispose(false) ne doit jamais lever d'exceptions car il est presque toujours appelé à partir d'un finaliseur.
Opérateurs d'égalité (==, !=)
Comme les méthodes Equals, les opérateurs d'égalité doivent retourner true ou false et ne doivent pas lever d'exceptions.
Opérateurs de cast implicites
Comme l'utilisateur sait rarement si un opérateur de cast implicite a été appelé, une exception levée par l'opérateur de cast implicite est totalement inattendue. Par conséquent, aucune exception ne doit être levée par des opérateurs de cast implicites.
Comment corriger les violations
Pour les accesseurs Get de propriété, modifiez la logique afin qu'il ne soit plus nécessaire de lever une exception ou remplacez la propriété par une méthode.
Pour tous les autres types de méthode répertoriés ci-dessus, modifiez la logique afin qu'il ne soit plus nécessaire de lever une exception.
Quand supprimer les avertissements
Il est possible de supprimer sans risque un avertissement de cette règle si la violation est provoquée par une déclaration d'exception au lieu d'une exception levée.
Règles connexes
Ne pas lever d'exceptions dans les clauses de gestion des exceptions