Не вызывайте исключения в непредвиденных местах
Обновлен: Ноябрь 2007
TypeName |
DoNotRaiseExceptionsInUnexpectedLocations |
CheckId |
CA1065 |
Категория |
Microsoft.Design |
Критическое изменение |
Не критическое |
Причина
Метод вызывает исключение, хотя не должен этого делать.
Описание правила
Методы, которые вызывают исключения, хотя и не должны этого делать, можно разделить на следующие категории.
Методы Property Get
Методы Event Accessor
Методы Equals
Методы GetHashCode
Методы ToString
Статические конструкторы
Методы завершения
Методы Dispose
Операторы равенства
Операторы неявного приведения
В следующих разделах эти типы методов рассматриваются подробно.
Методы Property Get
Свойства по сути являются "интеллектуальными" полями. Поэтому их поведение должно в максимальной степени соответствовать поведению поля. Поля, как и свойства, не вызывают исключения. Если имеется свойство, вызывающее исключение, следует подумать о том, чтобы преобразовать его в метод.
Следующие исключения могут возникать из метода получения свойства.
System.InvalidOperationException и все производные (включая System.ObjectDisposedException)
System.NotSupportedException и все производные
System.ArgumentException (только из индексированного метода получения)
KeyNotFoundException (только из индексированного метода получения)
Методы Event Accessor
Методы доступа к событиям должны быть простыми операторами, не вызывающими исключения. Событие не должно вызывать исключение при попытке добавления или удаления обработчика событий.
Следующие исключения могут возникать из метода доступа к событию.
System.InvalidOperationException и все производные (включая System.ObjectDisposedException)
System.NotSupportedException и все производные
ArgumentException и производные
Методы 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, и не должны вызывать исключения.
Операторы неявного приведения
Поскольку пользователю часто неизвестно когда вызывается оператор неявного приведения, вызов исключения операторов приведения является абсолютно непредвиденным. Таким образом, операторы неявного приведения не должны вызывать исключений.
Устранение нарушений
Для методов получения свойств измените логику, так чтобы более не возникало исключение, или измените свойство на метод.
Для все других перечисленных типов методов измените логику так, чтобы исключение не возникало.
Отключение предупреждений
Отключение предупреждений о нарушении данного правила безопасно в том случае, если нарушение было вызвано объявлением исключения, а не возникшим исключением.
Связанные правила
Не создавайте исключения в предложениях исключений