我正在研究一个给出字符串参数的方法。 string参数的有效值是null或string.Empty以外的任何值。所以我的代码看起来像这样。
private void SomeMethod(string someArgument) { if(string.IsNullOrEmpty(someArgument)) throw new ArgumentNullException("someArgument"); // do some work }
没有什么太令人兴奋的了。我的问题是,即使字符串等于string.Empty,也可以抛出ArgumentNullException吗?因为从技术上讲它不是空的。如果你认为它不应该抛出ArgumentNullException应该抛出什么异常?
答案 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
。
ArgumentException
是ArgumentNullException
和ArgumentOutOfRangeException
等的基类。这意味着它对于处理异常的开发人员来说更通用,信息更少。换句话说,尽管所有ArgumentNullException
和ArgumentOutOfRangeException
都是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
}