CA2201: не вызывайте зарезервированные типы исключений
Свойство | Значение |
---|---|
Идентификатор правила | CA2201 |
Заголовок | Не порождайте исключения зарезервированных типов |
Категория | Использование |
Исправление является критическим или не критическим | Критическое |
Включен по умолчанию в .NET 8 | No |
Причина
Метод вызывает тип исключения, слишком общий или зарезервированный средой выполнения.
Описание правила
Следующие типы исключений являются слишком общими для предоставления пользователю достаточной информации:
Следующие типы исключений зарезервированы и должны вызываться только средой CLR:
- System.AccessViolationException
- System.ExecutionEngineException
- System.IndexOutOfRangeException
- System.NullReferenceException
- System.OutOfMemoryException
- System.Runtime.InteropServices.COMException
- System.Runtime.InteropServices.ExternalException
- System.Runtime.InteropServices.SEHException
- System.StackOverflowException
Не вызывайте общие исключения
Если вы создаете общий тип исключения, например Exception библиотеку SystemExceptionили платформу, он заставляет потребителей перехватывать все исключения, включая неизвестные исключения, которые они не знают, как обрабатывать.
Вместо этого либо вызовите более производный тип, уже существующий в платформе, либо создайте собственный тип, производный от Exception.
Создание определенных исключений
В следующей таблице показано, какое исключение следует вызывать для различных типов недопустимых аргументов, включая параметр значения в set
методе доступа свойства.
Недопустимый аргумент | Исключение |
---|---|
Ссылка null |
ArgumentNullException |
За пределами допустимого диапазона значений (например, индекса для коллекции или списка) | ArgumentOutOfRangeException |
Недопустимое значение enum |
InvalidEnumArgumentException |
Содержит формат, который не соответствует спецификациям параметров метода (например, строке формата для ToString(String) ) |
FormatException |
Что-то другое неправильно | ArgumentException |
В следующей таблице показано, какое исключение следует вызывать для различных типов недопустимых операций.
Недопустимая операция | Исключение |
---|---|
Операция недопустима для текущего состояния объекта. | InvalidOperationException |
Операция выполняется для объекта, который был удален. | ObjectDisposedException |
Операция не поддерживается (например, при переопределении Stream.Write в потоке, открытом для чтения). |
NotSupportedException |
Преобразование приведет к переполнению (например, в явной перегрузке оператора приведения). | OverflowException |
Во всех остальных случаях рекомендуется создать собственный тип, производный от Exception, и вызывать его.
Устранение нарушений
Чтобы устранить нарушение этого правила, измените тип вызываемого исключения на определенный тип, который не является одним из зарезервированных типов.
Когда лучше отключить предупреждения
Для этого правила отключать вывод предупреждений не следует.