c# - 创建可能抛出 IndexOutOfRangeException 的属性

标签 c# api-design

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

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

如果列表中没有项目,将抛出异常。

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

最佳答案

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

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

虽然我会这么说,公开ArgumentOutOfRange异常可能会泄露实现细节。也就是说,如果此类的用户不知道内部结构是数组或 List<T> ,然后不要泄露该异常,而是捕获它、包装它并抛出一个更有意义的异常(自定义,或类似 InvalidOperationException 的东西)。

因为他们并没有真正直接传递参数,所以他们得到一个 ArgumentOutOfRange异常可能令人困惑 :-)

关于c# - 创建可能抛出 IndexOutOfRangeException 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11160883/

相关文章:

php - Laravel Rest API 的子域无法正常工作 - IONOS 使用 Plesk

c# - 图像未显示在 ASP.NET 上

c# - 同一应用程序中的多个静态变量范围?

c# - 如何跳过 IVsSingleFileGenerator 中的文件?

c# - 将动态对象传递给应用程序中 Post 数据的通用方法

C# 如何为类创建构造函数

c# - 使 Controller 方法异步会提高其性能吗?有什么好处?

java - 为什么 Java Streams 是一次性的?

java - 选择哪个选项来设计此 API 端点

encryption - 我可以在前端和后端加密密码吗?