CA1032 : Implémenter des constructeurs d'exception standard

TypeName

ImplementStandardExceptionConstructors

CheckId

CA1032

Catégorie

Microsoft.CSharp

Modification avec rupture

Modification sans rupture

Cause

Un type étend System.Exception et ne déclare pas tous les constructeurs requis.

Description de la règle

Les types d'exception doivent implémenter les constructeurs suivants :

  • public NewException()

  • public NewException(string)

  • public NewException(string, Exception)

  • NewException(SerializationInfo, StreamingContext) protégé ou privé

Ne pas fournir le jeu complet de constructeurs peut rendre difficile une gestion des exceptions correcte. Par exemple, le constructeur avec la signature NewException(string, Exception) est utilisé pour créer des exceptions provoquées par d'autres exceptions. Sans ce constructeur, vous ne pouvez ni créer, ni lever une instance de votre exception personnalisée contenant une exception interne (imbriquée) qui correspond à l'action que doit effectuer un code managé dans une telle situation. Les trois premiers constructeurs d'exceptions sont publics par convention. Le constructeur quatrième est protégé dans les classes non-sealed, et privé dans les classes sealed. Pour plus d'informations, consultez CA2229 : Implémentez des constructeurs de sérialisation.

Comment corriger les violations

Pour corriger une violation de cette règle, ajoutez les constructeurs manquants à l'exception, et assurez-vous qu'ils bénéficient de l'accessibilité appropriée.

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle quand la violation est provoquée par l'utilisation d'un niveau d'accès différent pour les constructeurs publics.

Exemple

L'exemple suivant présente un type d'exception qui enfreint cette règle, et un autre d'implémentation correcte.

using System;
using System.Runtime.Serialization;
namespace DesignLibrary
{
   // Violates rule ImplementStandardExceptionConstructors.
   public class BadException : Exception
   {
      public BadException()
      {
         // Add any type-specific logic, and supply the default message.
      }

   }  

   [Serializable()]
   public class GoodException : Exception
   {
      public GoodException()
      {
         // Add any type-specific logic, and supply the default message.
      }

      public GoodException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public GoodException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      protected GoodException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
   }  
}