Бөлісу құралы:


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

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

Причина

Метод, который не ожидается выбрасывать исключения, выбрасывает исключение.

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

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

  • Методы получения свойства
  • Методы доступа к событиям
  • Методы 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

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

См. также