我已多次看到以下异常情况
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文档更详细一些答案 0 :(得分:9)
如果存在空参数,则抛出ArgumentNullException。
如果有一个超出其范围的参数,则抛出ArgumentOutOfRange异常(如负数,其中只预期正数。)
如果参数因其超出范围或无效的原因而无效,则抛出ArgumentException。
如果调用由于与参数值无关的原因而无效,则抛出InvalidOperationException。
在这种特殊情况下,我可能会选择ArgumentException。该参数无效,因为其内容无效。
当然,所有这些都是异常,表明调用者有错误。给出最好的错误是一个好习惯,以便错误调用者的作者可以快速诊断问题。因此,我会考虑在异常中添加一条自定义消息,说“序列错误的元素出乎意料地为空”或者其他类似的东西。
答案 1 :(得分:4)
是的,正如here所述,您应尽可能抛出框架异常并抛出适用的派生异常。在这种情况下抛出ArgumentNullException
因为参数为null并且抛出ArgumentException
,因为枚举的内容不是函数的直接参数,所以你可以说参数是无效的,但这不是因为它我是空的或超出范围。
如果知道它无效为什么变得绝对必要,你可以从Argument Exception
得出;类似于ArgumentCollectionContainsNullException
。