我应该抛出自己的ArgumentOutOfRangeException还是从下面冒出一个泡泡?

Nei*_*l N 12 .net c# exception-handling exception

我有一个包装List <>的类

我有索引方法GetValue:

    public RenderedImageInfo GetValue(int index)
    {
        list[index].LastRetrieved = DateTime.Now;
        return list[index];
    }
Run Code Online (Sandbox Code Playgroud)

如果用户请求的索引超出范围,则会抛出ArgumentOutOfRangeException.

我应该让这种情况发生或检查并扔掉我自己的吗?即

    public RenderedImageInfo GetValue(int index)
    {
        if (index >= list.Count)
        {
            throw new ArgumentOutOfRangeException("index");
        }
        list[index].LastRetrieved = DateTime.Now;
        return list[index];
    }
Run Code Online (Sandbox Code Playgroud)

在第一个场景中,用户将从内部列表中获得异常,这会破坏用户不需要了解底层对象的OOP目标.

但在第二种情况下,我觉得好像在添加冗余代码.

编辑:
现在,我想到了,第三种情况,我捕获内部异常,修改它,并重新抛出它?

Ree*_*sey 12

你应该抛出自己的,原因有两个:

  1. 您可以在构造函数中显式设置适当的参数名称.这样,异常具有超出范围的Argument的适当参数信息.
  2. (次要)就用户而言,内部列表的异常将具有无效的堆栈跟踪.通过构造一个新的异常,您可以获得显示您的方法的堆栈跟踪是不合适的,这将更容易用户的调试.

至于捕获和修改内部异常 - 我不会推荐这个,必然.如果异常是额外信息可能有用的异常,则应使用新异常的InnerException来传播此信息.

在此示例(ArgumentOutOfRangeException)中,存在内部列表的事实应保留为实现细节,并且您的用户没有理由看到该信息.