Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1065 |
| Заголовок | Не вызывайте исключения в непредвиденных местах |
| Категория | Проектирование |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Метод, который не ожидается выбрасывать исключения, выбрасывает исключение.
Описание правила
Методы, которые не должны вызывать исключения, можно классифицировать следующим образом:
- Методы получения свойства
- Методы доступа к событиям
- Методы equals
- Методы GetHashCode
- Методы ToString
- Статические конструкторы
- Финализаторы
- Методы удаления
- Операторы равенства
- Неявные операторы приведения
Эти методы подробно обсуждаются в следующих разделах.
Методы получения свойств
Свойства — это, по сути, интеллектуальные поля. Поэтому они должны вести себя как поле, насколько это возможно. Поля не генерируют исключения, и свойства тоже не должны. Если у вас есть свойство, вызывающее исключение, возможно, следует сделать его методом.
Следующие исключения могут быть вызваны методом получения свойства:
- System.InvalidOperationException и все производные (включая System.ObjectDisposedException)
- System.NotSupportedException и все производные
- System.ArgumentException (только из индексированного get)
- System.Collections.Generic.KeyNotFoundException (только для индексированного метода get)
Методы доступа к событиям
Методы доступа к событиям должны быть простыми операциями, которые не вызывают исключений. При попытке добавления или удаления обработчика событий событие не должно вызывать исключение.
Метод доступа события может выбрасывать следующие исключения:
- System.InvalidOperationException и все производные (включая System.ObjectDisposedException)
- System.NotSupportedException и все производные
- System.ArgumentException и производные
Методы equals
Следующие методы Equals не должны вызывать исключения:
Метод Equals должен возвращать true или false вместо вызова исключения. Например, если Equals передаются два несовместимых типа, он должен просто вернуть false вместо того, чтобы выбросить исключение ArgumentException.
Методы GetHashCode
Как правило, следующие GetHashCode методы не должны вызывать исключения:
GetHashCode всегда должен возвращать значение. В противном случае можно потерять элементы в хэш-таблице.
Версии GetHashCode, которые принимают аргумент, могут вызвать ArgumentExceptionисключение.
Object.GetHashCode Однако никогда не следует вызывать исключение.
Методы ToString
Отладчик использует System.Object.ToString для вывода сведений об объектах в строковом формате.
ToString Поэтому не следует изменять состояние объекта, и он не должен вызывать исключения.
Статические конструкторы
Создание исключений из статического конструктора приводит к тому, что тип будет непригоден для использования в текущем домене приложения. У вас должна быть веская причина (например, проблемы с безопасностью) для создания исключения из статического конструктора.
Финализаторы
Бросок исключения из финализатора вызывает быструю остановку CLR, разрушая процесс. Избегайте возникновения исключений в финализаторе.
Методы удаления
Метод System.IDisposable.Dispose не должен вызывать исключение.
Dispose часто вызывается как часть логики очистки в предложении finally . Таким образом, явное выбрасывание исключения из Dispose вынуждает пользователя добавить обработку исключений в предложении finally.
Dispose(false) Кодовая ветвь никогда не должна вызывать исключения, так как Dispose почти всегда вызывается из финализатора.
Операторы равенства (==, !=)
Так же, как методы Equals, операторы равенства должны возвращать либо true, либо false, и не должны вызывать исключения.
Неявные операторы приведения
Поскольку пользователь часто не знает, что был вызван неявный оператор приведения, исключение, выдаваемое неявным оператором приведения, является непредвиденным. Поэтому из неявных операторов приведения не должны выбрасываться исключения.
Устранение нарушений
Для методов получения свойств либо измените логику так, чтобы она больше не вызывала исключение, либо измените свойство в методе.
Для всех других типов методов, перечисленных ранее, измените логику так, чтобы она больше не вызывала исключение.
Когда лучше отключить предупреждения
Если нарушение вызвано объявлением исключения вместо выданного исключения, можно отключить вывод предупреждения для этого правила.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.