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