Implementar constructores de excepción estándar

Actualización: noviembre 2007

Nombre de tipo

ImplementStandardExceptionConstructors

Identificador de comprobación

CA1032

Categoría

Microsoft.Design

Cambio problemático

No problemático

Motivo

Un tipo extiende System.Exception y no declara todos los constructores necesarios.

Descripción de la regla

Los tipos de excepción deben implementar los constructores siguientes:

  • public NewException()

  • public NewException(string)

  • public NewException(string, Exception)

  • protected o private NewException(SerializationInfo, StreamingContext)

El error al proporcionar el conjunto completo de constructores puede dificultar el control correcto de las excepciones. Por ejemplo, el constructor con la firma NewException(string, Exception) se utiliza para crear excepciones producidas por otras excepciones. Sin este constructor no se puede crear ni producir una instancia de la excepción personalizada que contenga una excepción interna (anidada), que es lo que el código administrado debe hacer en esta situación. Los primeros tres constructores de excepción son públicos por convención. El cuarto constructor está protegido en clases no selladas y es privado en clases selladas. Para obtener más información, vea Implementar constructores de serialización

Cómo corregir infracciones

Para corregir una infracción de esta regla, agregue los constructores que faltan a la excepción y asegúrese de que tienen la accesibilidad correcta.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si la infracción se ha provocado usando un nivel de acceso diferente al de los constructores públicos.

Ejemplo

El ejemplo siguiente contiene un tipo de excepción que infringe esta regla y otro que se implementa correctamente.

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