Бөлісу құралы:


CA2201: не вызывайте зарезервированные типы исключений

Свойство Значение
Идентификатор правила CA2201
Заголовок Не порождайте зарезервированных типов исключений
Категория Использование
Исправление является критическим или не критическим Срочное
Включен по умолчанию в .NET 10 Нет
Применимые языки C# и Visual Basic

Причина

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

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

Следующие типы исключений являются слишком общими для предоставления пользователю достаточной информации:

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

Не выбрасывайте общие исключения

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

Вместо этого либо вызовите более производный тип, уже существующий в платформе, либо создайте собственный тип, производный от Exception.

Создание определенных исключений

В следующей таблице показано, какое исключение следует выбрасывать для различных типов недопустимых аргументов, включая параметр значения в set методе доступа свойства.

Недопустимый аргумент Исключение
Ссылка null ArgumentNullException
За пределами допустимого диапазона значений (например, индекса для коллекции или списка) ArgumentOutOfRangeException
Недопустимое значение enum InvalidEnumArgumentException
Содержит формат, который не соответствует спецификациям параметров метода (например, строке формата для ToString(String)) FormatException
В противном случае недействительно ArgumentException

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

Недопустимая операция Исключение
Операция недопустима для текущего состояния объекта. InvalidOperationException
Операция выполняется для объекта, который был удален. ObjectDisposedException
Операция не поддерживается (например, при переопределении Stream.Write в потоке, открытом для чтения). NotSupportedException
Преобразование приведет к переполнению (например, в явной перегрузке оператора приведения). OverflowException

Во всех остальных случаях рекомендуется создать собственный тип, производный от Exception, и выбрасывать его.

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

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

Example

// This code violates the rule.
throw new Exception();
throw new NullReferenceException();
throw new IndexOutOfRangeException();
// ...

// This code satisfies the rule.
throw new ArgumentException();
throw new ArgumentNullException();
throw new InvalidOperationException();
// ...

// A minimal implementation of inheritance from Exception
public class CustomException : Exception { }

// Or create your own type that derives from Exception
// This code satisfies the rule too.
throw new CustomException();

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

Для этого правила отключать вывод предупреждений не следует.