CA1065: не вызывайте исключения в непредвиденных местах
Свойство | Значение |
---|---|
Идентификатор правила | CA1065 |
Заголовок | Не вызывайте исключения в непредвиденных местах |
Категория | Проектирование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Метод вызывает исключение, хотя не должен этого делать.
Описание правила
Методы, которые не должны вызывать исключения, можно классифицировать следующим образом:
- Методы получения свойства
- Методы доступа к событиям
- Методы 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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.