我应该抛出ArgumentNullException如果一个string是空白的?

我正在处理一个给定的string参数的东西。 string参数的有效值是除null或string.Empty以外的任何值。 所以我的代码看起来像这样。

私人无效SomeMethod(stringsomeArgument)
 {
    如果(string.IsNullOrEmpty(someArgument))
        抛出新的ArgumentNullException(“someArgument”);

     // 做一些工作
 }

那里没什么太刺激的。 我的问题是,是否可以抛出一个ArgumentNullException,即使该string等于string.Empty? 因为技术上它不是空的。 如果你相信它不应该抛出ArgumentNullException什么exception应该抛出?

应该为String.Empty案例引发ArgumentException 。 这将表明一个问题,而不是空的。 为了避免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方法一次执行这些检查。 通过这样做,你放弃了指定粒度exceptiontypes的能力,所以我会selectArgumentException并相应地更新消息。

如果空string不是您的方法接受的input,则应该抛出一个ArgumentException 。 如果抛出一个ArgumentNullException而没有提供一个null参数,那么客户端可能会非常困惑。

这只是另一个用例。 您也可能有方法不接受空input值,但确实接受空string。 在整个应用程序中保持一致非常重要。

考虑到所有已经说过的事情(乔·艾哈迈德·马吉德(Joe / Ahmad Mageed)),那么我会为这种情况制定一个例外。

 class ArgumentNullOrEmptyException : ArgumentNullException 

ArgumentNullException有时在.NET Framework中用于String.IsNullOrEmpty的情况 – 一个例子是System.Windows.Forms.Clipboard.SetText

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

请注意,从ArgumentException派生的这个和其他exception通常表示编程错误,因此需要提供帮助开发人员诊断问题所需的信息。 我个人认为,如果您使用ArgumentNullException作为空string参数,开发人员不太可能会感到困惑,尤其是如果您按照下面的示例logging此行为时。

 /// <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) { ... } 

这实际上取决于情况。

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

 class StringEmptyOrNullException : Exception { } 

你也可以添加自己的构造函数和附加信息等

如果它不是在你的程序中发生的“例外”,如果从方法中返回null并从那里处理它可能是一个好主意。 请记住, Exception是为了特殊的条件。

希望这可以帮助,

凯尔

为什么不使用这个代码?

 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 }