Condividi tramite


CA1032: Implementare costruttori di eccezioni standard

TypeName

ImplementStandardExceptionConstructors

CheckId

CA1032

Category

Microsoft.Design

Breaking Change

Non sostanziale

Causa

Un tipo estende System.Exception e non dichiara tutti i costruttori necessari.

Descrizione della regola

I tipi di eccezione devono implementare i seguenti costruttori:

  • public NewException()

  • public NewException(string)

  • public NewException(string, Exception)

  • protected o private NewException(SerializationInfo, StreamingContext)

Se non viene fornito l'insieme completo di costruttori può risultare difficile gestire correttamente le eccezioni. Il costruttore con la firma NewException(string, Exception), ad esempio, viene utilizzato per creare eccezioni causate da altre eccezioni. Senza questo costruttore, non è possibile creare e generare un'istanza dell'eccezione personalizzata che contiene un'eccezione interna (annidata), operazione prevista per il codice gestito in tale situazione. I primi tre costruttori di eccezioni sono pubblici per convenzione. Il quarto costruttore è protetto nelle classi non sealed e privato nelle classi sealed. Per ulteriori informazioni, vedere CA2229: Implementare costruttori di serializzazione.

Come correggere le violazioni

Per correggere una violazione di questa regola, aggiungere i costruttori mancanti all'eccezione e assicurarsi che dispongano dell'accessibilità corretta.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura quando la violazione è causata dall'utilizzo di un livello di accesso diverso per i costruttori pubblici.

Esempio

L'esempio riportato di seguito contiene un tipo di eccezione che viola questa regola e un tipo di eccezione implementato correttamente.

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.
      }
   }  
}