什么时候适合从属性 getter 或 setter 中抛出异常?什么时候不合适呢?为什么?关于这个主题的外部文档的链接会很有帮助……谷歌搜索结果出奇的少。
Microsoft 在以下位置提供了有关如何设计属性的建议:http://msdn.microsoft.com/en-us/library/ms229006.aspx http://msdn.microsoft.com/en-us/library/ms229006.aspx
本质上,他们建议属性获取器是始终可以安全调用的轻量级访问器。如果您需要抛出异常,他们建议将 getter 重新设计为方法。对于设置者来说,它们表明异常是一种适当且可接受的错误处理策略。
对于索引器,微软表示 getter 和 setter 抛出异常是可以接受的。事实上,.NET 库中的许多索引器都这样做。最常见的例外是ArgumentOutOfRangeException
.
您不想在属性 getter 中抛出异常有一些很好的理由:
- 因为属性“看起来”是字段,所以并不总是明显它们可以抛出(按设计)异常;而对于方法,程序员接受的培训是预期并调查异常是否是调用该方法的预期结果。
- 许多 .NET 基础设施都使用 Getter,例如序列化器和数据绑定(例如在 WinForms 和 WPF 中)——在此类上下文中处理异常很快就会出现问题。
- 当您观察或检查对象时,调试器会自动评估属性 getter。这里的异常可能会令人困惑并减慢您的调试工作。出于同样的原因,也不希望在属性中执行其他昂贵的操作(例如访问数据库)。
- 属性经常用在链接约定中:
obj.PropA.AnotherProp.YetAnother
- 使用这种语法,决定在哪里注入异常 catch 语句就变得有问题。
作为旁注,人们应该意识到,仅仅因为财产是未设计抛出异常,并不意味着它不会;它可以很容易地调用这样做的代码。即使是分配新对象(如字符串)的简单行为也可能导致异常。您应该始终以防御性方式编写代码,并期望您调用的任何内容都会出现异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)