我有一个包含项目集合的类。为方便起见,我提供了 GetCurrentItem ,它由
public Type GetCurrentItem
{
get { return this.items[this.items.Count - 1]; }
}
如果列表中没有项目,这将引发异常。
我应该让异常被抛出还是应该返回null
?如果这是我交给你的 API,你会期待什么?异常还是空?有没有更好的方法来处理这个?
我有一个包含项目集合的类。为方便起见,我提供了 GetCurrentItem ,它由
public Type GetCurrentItem
{
get { return this.items[this.items.Count - 1]; }
}
如果列表中没有项目,这将引发异常。
我应该让异常被抛出还是应该返回null
?如果这是我交给你的 API,你会期待什么?异常还是空?有没有更好的方法来处理这个?
至于哪个更正确?正如柯克的评论所暗示的:这取决于。有时 anull
是合乎逻辑的,有时如果没有合理的默认值,则异常更适合。我尝试做的一件事是考虑“是称GetCurrentItem
逻辑失败还是安全的事情?”
如果是在没有的情况下调用失败GetCurrentItem
,那么抛出异常是正确的做法。例如,如果您的集合有一个HasCurrent
orIsEmpty
属性,某人可以在调用 之前检查结果GetCurrentItem
,那么他们应该“知道得更好”。但是,如果当前项目是null
使用您的类的正确逻辑方式,那么一定要以这种方式设计它。无论哪种方式,我都会在代码注释中记录行为,让用户知道预期的行为。
不过我会这么说,暴露ArgumentOutOfRange
异常可能会影响实现细节。List<T>
也就是说,如果这个类InvalidOperationException
的用户不知道内部结构是一个数组或.
由于它们并没有真正直接传递参数,因此它们获得ArgumentOutOfRange
异常可能会令人困惑:-)
让它抛出一个错误。这就是其他集合的工作方式。应该由用户应用程序来处理潜在的异常(尤其是在使用集合时)。可能应该有一个bool HasSelection()
用户可以在继续之前调用的方法。
例外情况应该用于例外情况。如果 CurrentItem 可以为 null,则不应引发异常。我不明白为什么没有 CurrentItem 是例外。
那么问题是您是否希望 GetCurrentItem 返回一个安全值。如果 Type 可以为空,则 GetCurrentItem 应该在没有当前项目时返回 null。如果您总是希望列表不为空并且默认情况下总是选择某些内容,那么抛出一个有意义的异常。
除非您的案例确实是异常而不是正常用例,否则您通常不应该抛出异常。然而,这可能是相当主观的。
我尝试从用户的角度来考虑它。去找最不惊讶的校长。
如果我正在使用库或对象并调用GetCurrentItem
并抛出 an IndexOutOfRangeException
,我会想,“我没有调用任何带有索引的东西,我想要当前项目。” 因此,我的建议是返回 null,这会让我想,“哦,没有当前项目。”
或者,如果该属性是一个索引器并且我想在某个索引处获取一个项目,我不会对IndexOutOfRangeException
.
如果此 GetCurrentItem 对您的 API 有意义,我会在没有项目时抛出“InvalidOperationException”。如果允许 null 作为有效结果,您可能希望以不同的方式命名它。
考虑现有的LINQ Last方法是否已经提供了相同的功能。
如有疑问,请遵循 .NET。此功能类似于 List.Last(),如果为空则抛出异常。