Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2201 |
| Заголовок | Не порождайте зарезервированных типов исключений |
| Категория | Использование |
| Исправление является критическим или не критическим | Срочное |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Метод вызывает тип исключения, слишком общий или зарезервированный средой выполнения.
Описание правила
Следующие типы исключений являются слишком общими для предоставления пользователю достаточной информации:
Следующие типы исключений зарезервированы и должны вызываться только средой 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, и выбрасывать его.
Устранение нарушений
Чтобы устранить нарушение этого правила, измените тип генерируемого исключения на определенный тип, который не является одним из зарезервированных типов.
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();
Когда лучше отключить предупреждения
Для этого правила отключать вывод предупреждений не следует.