c# - 最佳实践 : throwing exceptions from properties

标签 c# .net exception properties

什么时候从属性 getter 或 setter 中抛出异常是合适的?什么时候不合适?为什么?指向有关该主题的外部文档的链接会有所帮助……谷歌搜索结果出乎意料的少。

最佳答案

Microsoft 在 http://msdn.microsoft.com/en-us/library/ms229006.aspx 上提供了有关如何设计属性的建议

从本质上讲,他们建议属性 getter 是始终可以安全调用的轻量级访问器。如果您需要抛出异常,他们建议将 getter 重新设计为方法。对于 setter,它们表明异常是一种适当且可接受的错误处理策略。

对于索引器,Microsoft 表示 getter 和 setter 都可以抛出异常。事实上,.NET 库中的许多索引器都是这样做的。最常见的异常是 ArgumentOutOfRangeException

您不想在属性 getter 中抛出异常有一些很好的理由:

  • 因为属性“看起来”是字段,所以并不总是很明显它们可以抛出(设计上的)异常;而对于方法,程序员经过培训可以预期并调查异常是否是调用该方法的预期结果。
  • Getter 被许多 .NET 基础设施使用,例如序列化程序和数据绑定(bind)(例如在 WinForms 和 WPF 中)- 在此类上下文中处理异常很快就会成为问题。
  • 当您观察或检查对象时,调试器会自动评估属性 getter 。这里的异常可能会混淆并减慢您的调试工作。出于同样的原因,也不希望在属性中执行其他昂贵的操作(如访问数据库)。
  • 属性通常用在链接约定中:obj.PropA.AnotherProp.YetAnother - 使用这种语法,决定在何处注入(inject)异常捕获语句变得有问题。

作为旁注,人们应该意识到仅仅因为一个属性没有设计来抛出异常,这并不意味着它不会;它可以很容易地调用执行的代码。即使是分配新对象(如字符串)的简单行为也可能导致异常。您应该始终防御性地编写您的代码,并期望您调用的任何内容都会出现异常。

关于c# - 最佳实践 : throwing exceptions from properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1488472/

相关文章:

c# - 进度条在 winform 中卡住

c# - 仅当值不为空时才应用 RuleFor

c# - 动态添加链接按钮到 ASP GridView

c# - 如何使用javascript将文本框数据保存到文件

c# - 如何在 .NET 中构建消息系统?

python - 如何捕获 PyCharm 调试器的 "Stop Button"?

java - 如何以用户友好的方式使用 GoogleDocs 查看 ACRA 异常(exception)情况?

macos - 在MacOSX/PPC上,有关如何在0x0000000000000000处捕获KERN_PROTECTION_FAILURE的建议

c# - 在当前终端执行命令,无需打开新终端。

c# - Moq - 检查方法是否被模拟(设置)