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

Свойство Значение
Идентификатор правила CA1032
Заголовок Реализуйте стандартные конструкторы исключений
Категория Проектирование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

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

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

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

  • public NewException()

  • public NewException(string)

  • public NewException(string, Exception)

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

Дополнительные сведения см. в правиле CA2229: применяйте конструкторы сериализации.

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

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

Когда лучше отключить предупреждения

Предупреждения о нарушении этого правила можно безопасно скрывать, если нарушение вызвано использованием другого уровня доступа для открытых конструкторов.

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

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA1032
// The code that's violating the rule is on this line.
#pragma warning restore CA1032

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA1032.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Пример

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

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

См. также

CA2229: применяйте конструкторы сериализации