CA1065: не вызывайте исключения в непредвиденных местах

Свойство Значение
Идентификатор правила CA1065
Заголовок Не вызывайте исключения в непредвиденных местах
Категория Проектирование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Метод вызывает исключение, хотя не должен этого делать.

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

Методы, которые не должны вызывать исключения, можно классифицировать следующим образом:

  • Методы получения свойства
  • Методы доступа к событиям
  • Методы equals
  • Методы GetHashCode
  • Методы ToString
  • Статические конструкторы
  • Методы завершения
  • Методы удаления
  • Операторы равенства
  • Неявные операторы приведения

Эти методы подробно обсуждаются в следующих разделах.

Методы получения свойства

Свойства — это, по сути, интеллектуальные поля. Поэтому они должны вести себя максимально похоже на поля. Поля не вызывают исключения, и свойства тоже не должны. Если у вас есть свойство, вызывающее исключение, возможно, следует сделать его методом.

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

Методы доступа к событиям

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

Метод доступа к событию может вызывать следующие исключения:

Методы 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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

См. также