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

Mad*_*avn 5 .net c# 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++;
        }
    }
Run Code Online (Sandbox Code Playgroud)

是否有处理这些案件的指导方针?通常,有任何描述"异常样式"的指南比MSDN文档更详细

Eri*_*ert 9

如果存在null参数,则抛出ArgumentNullException.

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

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

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

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

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


Wil*_*elm 4

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

如果知道它为什么无效变得绝对有必要,你可以从Argument Exception; 就像是ArgumentCollectionContainsNullException