我有一个包装 List<>
的类我有通过索引方法获取值:
public RenderedImageInfo GetValue(int index)
{
list[index].LastRetrieved = DateTime.Now;
return list[index];
}
如果用户请求超出范围的索引,这将抛出 ArgumentOutOfRangeException 。
我应该让这种情况发生,还是检查它然后扔掉我自己的?即
public RenderedImageInfo GetValue(int index)
{
if (index >= list.Count)
{
throw new ArgumentOutOfRangeException("index");
}
list[index].LastRetrieved = DateTime.Now;
return list[index];
}
在第一种情况下,用户会有一个来自内部列表的异常,这打破了我的 OOP 目标,即用户不需要了解底层对象。
但在第二种情况下,我觉得我好像在添加冗余代码。
编辑:
现在我想到了,第三种情况怎么样,我捕获内部异常,修改它,然后重新抛出它?
最佳答案
出于以下几个原因,您应该自己扔掉:
- 您可以显式设置 appropriate parameter name in the constructor .这样,异常就有了超出范围的 Argument 的适当参数信息。
- (次要)就您的用户而言,内部列表的异常将具有无效的堆栈跟踪。通过构造一个新的异常,您可以获得堆栈跟踪,显示您的方法是不合适的,这将更容易让您的用户进行调试。
至于捕获和修改内部异常——我不一定会推荐这样做。如果异常是额外信息可能有用的异常,则应使用 InnerException您的新异常(exception)传播此信息了。
在此示例中(ArgumentOutOfRangeException),存在内部列表的事实应作为实现细节保留,您的用户没有理由看到该信息。
关于c# - 我应该抛出自己的 ArgumentOutOfRangeException 还是让一个气泡从下面向上冒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2526434/