如果字符串为空,我应该抛出ArgumentNullException吗?

时间:2009-08-31 05:42:18

标签: .net

我正在研究一个给出字符串参数的方法。 string参数的有效值是null或string.Empty以外的任何值。所以我的代码看起来像这样。

private void SomeMethod(string someArgument)
{
    if(string.IsNullOrEmpty(someArgument))
        throw new ArgumentNullException("someArgument");

    // do some work
}

没有什么太令人兴奋的了。我的问题是,即使字符串等于string.Empty,也可以抛出ArgumentNullException吗?因为从技术上讲它不是空的。如果你认为它不应该抛出ArgumentNullException应该抛出什么异常?

7 个答案:

答案 0 :(得分:37)

对于String.Empty案例,应该抛出

ArgumentException。这表示除了null之外的问题。为了避免NullReferenceException我首先检查null,然后我修剪并检查空案例以防止任何空格传递。

private void SomeMethod(string someArgument)
{
    if(someArgument == null)
        throw new ArgumentNullException("someArgument");

    if (someArgument.Trim() == String.Empty)
        throw new ArgumentException("Input cannot be empty", "someArgument");

    // do some work
}

从.NET 4.0开始,您可以使用String.IsNullOrWhiteSpace方法一次性执行这些检查。通过这样做,您可以放弃指定粒度异常类型的功能,因此我会选择ArgumentException并相应地更新消息。

答案 1 :(得分:5)

如果空字符串不是您方法的可接受输入,则应抛出ArgumentException。如果您在未提供ArgumentNullException参数的情况下抛出null,则客户可能会感到非常困惑。

这只是另一个用例。您可能还有不接受空输入值但接受空字符串的方法。在整个应用程序中保持一致非常重要。

答案 2 :(得分:4)

考虑到已经说过的所有事情(Joe / Ahmad Mageed),我会为那个案例创建一个例外。

class ArgumentNullOrEmptyException : ArgumentNullException

答案 3 :(得分:2)

ArgumentNullException有时在.NET Framework中用于String.IsNullOrEmpty案例 - 例如System.Windows.Forms.Clipboard.SetText

所以我认为在你的代码中做同样的事情是合理的,除非在区分这两种情况方面有一些真正的价值。

请注意,从ArgumentException派生的此异常和其他异常通常表示编程错误,因此需要提供帮助开发人员诊断问题所需的信息。我个人认为,如果你将ArgumentNullException用于空字符串参数,开发人员不太可能会发现它令人困惑,特别是如果你记录下面的例子中的这种行为。

/// <summary>
/// ... description of method ...
/// </summary>
/// <param name="someArgument">... description ...</param>
/// <exception cref="ArgumentNullException">someArgument is a null reference or Empty.</exception>
public void SomeMethod(string someArgument)
{
   ...
}

答案 4 :(得分:1)

古老的问题,但由于Google对其进行了高度评价,因此,这对以后的读者来说是另一个(更好!)选择:ArgumentOutOfRangeException

ArgumentExceptionArgumentNullExceptionArgumentOutOfRangeException等的基类。这意味着它对于处理异常的开发人员来说更通用,信息更少。换句话说,尽管所有ArgumentNullExceptionArgumentOutOfRangeException都是ArgumentException,但事实并非如此。

ArgumentOutOfRangeException是一个更具体的例外,它表示“您提供的值不在我期望的值范围内”,这正是您要告诉其他开发人员的内容。如果您不接受空字符串,这是最好的标准异常类型。

或者,如果区分两个值真的很重要,则创建一个自己的从ArgumentNullException派生的异常类型。

在处理您的异常时,不需要区分为什么他们提供的值错误的其他开发人员可以捕获ArgumentException并立即获得它们。

答案 5 :(得分:0)

这实际上取决于环境。

问题归结为,这真的是一个错误吗?我的意思是你总是期待一个价值?如果你这样做,那么你最好的选择就是创建自己的Exception,或许是这样的:

class StringEmptyOrNullException : Exception
{
}

您还可以添加自己的构造函数和添加信息等。

如果它不是程序中发生的“异常”,那么从方法返回null并从那里处理它可能是个更好的主意。请记住,Exception是出于特殊情况。

希望这有帮助,

凯尔

答案 6 :(得分:0)

为什么不使用此代码?

private void SomeMethod(string someArgument)
{
//chek only NULL
if(ReferenceEquals(someArgument,null))
    throw new ArgumentNullException("someArgument");

// and after trim and check
if (someArgument.Trim() == String.Empty)
    throw new ArgumentException("Input cannot be empty", "someArgument");

// do some work
}