什么时候从属性 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/