Поделиться через


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

Обновлен: Ноябрь 2007

TypeName

DoNotRaiseExceptionsInUnexpectedLocations

CheckId

CA1065

Категория

Microsoft.Design

Критическое изменение

Не критическое

Причина

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

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

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

  • Методы Property Get

  • Методы Event Accessor

  • Методы Equals

  • Методы GetHashCode

  • Методы ToString

  • Статические конструкторы

  • Методы завершения

  • Методы Dispose

  • Операторы равенства

  • Операторы неявного приведения

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

Методы Property Get

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

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

Методы Event Accessor

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

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

Методы Equals

Следующие методы Equals не должны вызывать исключения.

Метод Equals должен возвращать true или false, а не вызывать исключение. Например, если методу Equals передано два несовпадающих типа, он должен просто вернуть false, а не вызывать ArgumentException.

Методы GetHashCode

Следующие методы GetHashCode обычно не должны вызывать исключения.

GetHashCode должен всегда возвращать значение. В противном случае элементы могут быть потеряны в хэш-таблице.

Версии GetHashCode , принимающие аргументы, могут вызывать ArgumentException. При этом Object.GetHashCode никогда не должен вызывать исключения.

Методы ToString

Отладчик использует Object.ToString для отображения сведений об объектах в строковом формате. Таким образом, ToString не должен изменять состояние и объекта и не должен вызывать исключений.

Статические конструкторы

Исключения из статического конструктора приводят к непригодности типа для использования в текущем домене приложений. Вызов исключения из статического конструктора должен быть обусловлен очень веской причиной (такой как проблема безопасности).

Методы завершения

Вызов исключения из метода завершения приводит к скорому сбою CLR, разрушая процесс. Таким образом, следует всегда избегать вызова исключений в методе завершения.

Методы Dispose

Метод IDisposable.Dispose или [M:System.IDisposable.Dispose(bool disposing)] не должен вызывать исключения. Метод Dispose часть вызывается как часть логики очистки в предложении finally. Таким образом, явный вызов исключения из метода Dispose вынуждает пользователя добавлять обработку исключений в предложение finally.

Путь к коду Dispose(false) никогда не должен вызывать исключений, так как он практически всегда вызывается из метода завершения.

Операторы равенства (==, !=)

Подобно методам Equals, операторы равенства должны возвращать true или false, и не должны вызывать исключения.

Операторы неявного приведения

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

Устранение нарушений

Для методов получения свойств измените логику, так чтобы более не возникало исключение, или измените свойство на метод.

Для все других перечисленных типов методов измените логику так, чтобы исключение не возникало.

Отключение предупреждений

Отключение предупреждений о нарушении данного правила безопасно в том случае, если нарушение было вызвано объявлением исключения, а не возникшим исключением.

Связанные правила

Не создавайте исключения в предложениях исключений

См. также

Другие ресурсы

Предупреждения конструктора