我应该抛出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 }