7

我有一个包含项目集合的类。为方便起见,我提供了 GetCurrentItem ,它由

public Type GetCurrentItem
{
     get { return this.items[this.items.Count - 1]; }  
}

如果列表中没有项目,这将引发异常。

我应该让异常被抛出还是应该返回null?如果这是我交给你的 API,你会期待什么?异常还是空?有没有更好的方法来处理这个?

4

7 回答 7

9

至于哪个更正确?正如柯克的评论所暗示的:这取决于。有时 anull是合乎逻辑的,有时如果没有合理的默认值,则异常更适合。我尝试做的一件事是考虑“是称GetCurrentItem逻辑失败还是安全的事情?”

如果是在没有的情况下调用失败GetCurrentItem,那么抛出异常是正确的做法。例如,如果您的集合有一个HasCurrentorIsEmpty属性,某人可以在调用 之前检查结果GetCurrentItem,那么他们应该“知道得更好”。但是,如果当前项目是null使用您的类的正确逻辑方式,那么一定要以这种方式设计它。无论哪种方式,我都会在代码注释中记录行为,让用户知道预期的行为。

不过我会这么说,暴露ArgumentOutOfRange异常可能会影响实现细节。List<T>也就是说,如果这个类InvalidOperationException的用户不知道内部结构是一个数组或.

由于它们并没有真正直接传递参数,因此它们获得ArgumentOutOfRange异常可能会令人困惑:-)

于 2012-06-22T17:10:22.767 回答
3

让它抛出一个错误。这就是其他集合的工作方式。应该由用户应用程序来处理潜在的异常(尤其是在使用集合时)。可能应该有一个bool HasSelection()用户可以在继续之前调用的方法。

于 2012-06-22T17:09:52.867 回答
3

例外情况应该用于例外情况。如果 CurrentItem 可以为 null,则不应引发异常。我不明白为什么没有 CurrentItem 是例外。

于 2012-06-22T17:10:14.347 回答
1

那么问题是您是否希望 GetCurrentItem 返回一个安全值。如果 Type 可以为空,则 GetCurrentItem 应该在没有当前项目时返回 null。如果您总是希望列表不为空并且默认情况下总是选择某些内容,那么抛出一个有意义的异常。

除非您的案例确实是异常而不是正常用例,否则您通常不应该抛出异常。然而,这可能是相当主观的。

于 2012-06-22T17:11:05.123 回答
1

我尝试从用户的角度来考虑它。去找最不惊讶的校长

如果我正在使用库或对象并调用GetCurrentItem并抛出 an IndexOutOfRangeException,我会想,“我没有调用任何带有索引的东西,我想要当前项目。” 因此,我的建议是返回 null,这会让我想,“哦,没有当前项目。”

或者,如果该属性是一个索引器并且我想在某个索引处获取一个项目,我不会对IndexOutOfRangeException.

于 2012-06-22T17:15:26.950 回答
0

如果此 GetCurrentItem 对您的 API 有意义,我会在没有项目时抛出“InvalidOperationException”。如果允许 null 作为有效结果,您可能希望以不同的方式命名它。

考虑现有的LINQ Last方法是否已经提供了相同的功能。

于 2012-06-22T17:13:56.320 回答
0

如有疑问,请遵循 .NET。此功能类似于 List.Last(),如果为空则抛出异常。

http://msdn.microsoft.com/en-us/library/bb358775

于 2012-06-22T17:16:43.713 回答