Поделиться через


CA1032: реализуйте стандартные конструкторы исключения

TypeName

ImplementStandardExceptionConstructors

CheckId

CA1032

Категория

Microsoft.Design

Критическое изменение

Не критическое

Причина

Тип расширяет класс System.Exception, однако не объявляет все обязательные конструкторы.

Описание правила

Типы исключений должны реализовывать следующие конструкторы:

  • открытый NewException()

  • открытый NewException(строка)

  • открытый NewException(строка, исключение)

  • защищенный или закрытый NewException(SerializationInfo, StreamingContext)

Для правильной обработки исключений необходимо предоставить полный набор конструкторов. Например, конструктор с сигнатурой NewException(string, Exception) используется для создания исключений, вызванных другими исключениями. Без этого конструктора невозможно реализовать обычное поведение управляемого кода в таких ситуациях, то есть создать и вызвать экземпляр пользовательского исключения, которое содержит внутреннее (вложенное) исключение. Первые три конструктора исключений являются открытыми по соглашению. Четвертый конструктор является защищенным в незапечатанных классах и закрытым в запечатанных классах. Дополнительные сведения см. в разделе CA2229: применяйте конструкторы сериализации.

Устранение нарушений

Чтобы устранить нарушение данного правила, добавьте отсутствующие конструкторы в класс исключений и убедитесь, что они обладают правильной доступностью.

Отключение предупреждений

Отключение предупреждений о нарушении данного правила безопасно в том случае, если нарушение вызвано другим уровнем доступа для открытых конструкторов.

Пример

В следующем примере содержится тип исключений, который нарушает данное правило, а также правильно реализованный тип исключений.

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