当IEnumerable包含null时使用什么异常类

时间:2010-03-10 23:57:20

标签: c# .net exception

我已多次看到以下异常情况

    public SomeClass(IEnumerable<T> someValues)
    {
        if (null == someValues)
        {
            throw new ArgumentNullException("someValues");
        }

        int counter = 0;
        foreach (T value in someValues)
        {
            if (null == value)
            {
                string msg = counter + "th value was null";
                // What exception class to use?
                throw new ArgumentException(msg, "someValues");
            }
            counter++;
        }
    }

是否有处理这些案件的指南?通常,有任何描述“异常样式”的指南比

的MSDN文档更详细一些

2 个答案:

答案 0 :(得分:9)

如果存在空参数,则抛出ArgumentNullException。

如果有一个超出其范围的参数,则抛出ArgumentOutOfRange异常(如负数,其中只预期正数。)

如果参数因其超出范围或无效的原因而无效,则抛出ArgumentException。

如果调用由于与参数值无关的原因而无效,则抛出InvalidOperationException。

在这种特殊情况下,我可能会选择ArgumentException。该参数无效,因为其内容无效。

当然,所有这些都是异常,表明调用者有错误。给出最好的错误是一个好习惯,以便错误调用者的作者可以快速诊断问题。因此,我会考虑在异常中添加一条自定义消息,说“序列错误的元素出乎意料地为空”或者其他类似的东西。

答案 1 :(得分:4)

是的,正如here所述,您应尽可能抛出框架异常并抛出适用的派生异常。在这种情况下抛出ArgumentNullException因为参数为null并且抛出ArgumentException,因为枚举的内容不是函数的直接参数,所以你可以说参数是无效的,但这不是因为它我是空的或超出范围。

如果知道它无效为什么变得绝对必要,你可以从Argument Exception得出;类似于ArgumentCollectionContainsNullException