c# - 我应该抛出自己的 ArgumentOutOfRangeException 还是让一个气泡从下面向上冒?

标签 c# .net exception exception-handling

我有一个包装 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 目标,即用户不需要了解底层对象。

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

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

最佳答案

出于以下几个原因,您应该自己扔掉:

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

至于捕获和修改内部异常——我不一定会推荐这样做。如果异常是额外信息可能有用的异常,则应使用 InnerException您的新异常(exception)传播此信息了。

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

关于c# - 我应该抛出自己的 ArgumentOutOfRangeException 还是让一个气泡从下面向上冒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2526434/

相关文章:

c# - 在 Xamarin ios 中显示不同样式(列表、网格、 block )的项目?

c# - 可以转换为 float 然后再转换回小数的最小小数是多少?

c# - 通过 HTTP 302 重定向从 WebClient 获取位置?

c# - 使用 dotnet 发布时设置 exe 文件版本

java - 我的线程中出现 NoClassDefFoundError 异常

c# - 从 Linq 查询异常中抛出异常

c# - Entity Framework Core 中的添加迁移错误

.net - .NET 客户端配置文件值得瞄准吗?

java - 当第一个策略和恢复策略都失败时 Java 中的异常组合

c# - Windows Azure Servicebus token 提供程序无法提供 token ,但返回了空消息