如何使用多个参数的ArgumentOutOfRangeException?

时间:2014-09-24 20:06:49

标签: c# exception

我有以下代码。

DoSomething(int min, int max)
{
    if (min < 1 || min > 5)
        throw new ArgumentOutOfRangeException("min");
    if (max < 1 || max > 5)
        throw new ArgumentOutOfRangeException("max");
    if (min > max)
        throw new ArgumentOutOfRangeException("min & max");

    DoSomethingWithYourLife(); // =)
}

在文档中我声明min和max必须在[1-5]范围内,max必须大于或等于min。

是否正确构建了第三个异常?如果没有,我应该如何构建异常?

2 个答案:

答案 0 :(得分:5)

不,ArgumentOutOfRangeException构造函数的参数应该始终是参数名称之一。您可以选择其中任何一个 - 我通常认为之前的参数是正确的,因此以后的参数与之相关是不正确的。您可以(并且应该)在消息中提供更多信息。如果您给出实际值,那么真的也很方便 - 所以:

if (min < 1 || min > 5)
{
    throw new ArgumentOutOfRangeException("min", min, "min must be between 1 and 5 inclusive");
}
if (max < 1 || max > 5)
{
    throw new ArgumentOutOfRangeException("max", max, "max must be between 1 and 5 inclusive");
}
if (max < min)
{
    throw new ArgumentOutOfRangeException("max", max, "max must not not be less than min");
}

对于Noda Time,我有这方面的辅助方法,例如:

internal static void CheckArgumentRange(string paramName,
    int value, int minInclusive, int maxInclusive)
{
    if (value < minInclusive || value > maxInclusive)
    {
        throw new ArgumentOutOfRangeException(paramName, value,
            "Value should be in range [" + minInclusive + "-" + maxInclusive + "]");
    }
}

这样你就可以将上述内容简化为:

Preconditions.CheckArgumentRange("min", min, 1, 5);
Preconditions.CheckArgumentRange("max", max, 1, 5);
if (max < min)
{
    throw new ArgumentOutOfRangeException("max", max, "max must not not be less than min");
}

答案 1 :(得分:0)

我强烈建议您只选择其中一个,但在构造函数的this overload中提供更详细的错误消息:

if (min > max)
    throw new ArgumentOutOfRangeException("max", "max must be greater than or equal to min");