代码之家  ›  专栏  ›  技术社区  ›  Kepboy

如果字符串为空,是否应引发ArgumentNullException?

  •  52
  • Kepboy  · 技术社区  · 15 年前

    我正在研究一种方法,它可以对给定的字符串参数执行某些操作。字符串参数的有效值不是null或string.empty。所以我的代码看起来像这样。

    private void SomeMethod(string someArgument)
    {
        if(string.IsNullOrEmpty(someArgument))
            throw new ArgumentNullException("someArgument");
    
        // do some work
    }
    

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

    6 回复  |  直到 11 年前
        1
  •  37
  •   Ahmad Mageed    12 年前

    ArgumentException 应该为 String.Empty 案例。这将指示一个问题,而不是它为空。为了避免 NullReferenceException 我先检查是否为空,然后修剪并检查空箱子,以防止任何空白通过。

    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 并相应地更新消息。

        2
  •  5
  •   Ronald Wildenberg    15 年前

    你应该扔一个 ArgumentException 如果空字符串不是方法的可接受输入。如果你把一个 ArgumentNullException 但他们没有提供 null 争论。

    它只是另一个用例。也可以有不接受空输入值但接受空字符串的方法。在整个应用程序中保持一致是很重要的。

        3
  •  4
  •   Marcel Jackwerth    15 年前

    考虑到已经说过的所有事情(乔/艾哈迈德·马杰德),我会为那个案件创建一个例外。

    class ArgumentNullOrEmptyException : ArgumentNullException
    
        4
  •  2
  •   to StackOverflow    15 年前

    argumentNullException有时在.NET框架中用于字符串.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)
    {
       ...
    }
    
        5
  •  0
  •   Kyle Rosendo    15 年前

    这真的取决于环境。

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

    class StringEmptyOrNullException : Exception
    {
    }
    

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

    但是,如果它不是在您的程序中发生的“异常”,那么从该方法返回空值并从那里处理它可能是一个更好的主意。只要记住, 例外 S适用于特殊情况。

    希望这有帮助,

    凯尔

        6
  •  0
  •   saalon    14 年前

    为什么不使用这个代码?

    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
    }