嵌套成员的ArgumentNullException

时间:2014-12-29 13:26:24

标签: c# .net validation exception-handling argumentnullexception

我们说我有一个方法:

public void SayHello(User user)
{
    if (user == null)
        throw new ArgumentNullException("user");

    Console.Write(string.Format("Hello from {0}", user.Name));
}

很明显我应该使用如上所示的ArgumentNullException来验证用户不是null。现在我如何验证user.Name不为空?这样做是不错的做法:

if (string.IsNullOrWhiteSpace(user.Name))
    throw new ArgumentNullException("user", "Username is empty");

2 个答案:

答案 0 :(得分:8)

不,您不应该为此目的而抛出ArgumentNullException,因为它专门用于解决null引用问题。

  

null 引用时抛出的异常(Visual中没有任何内容)   Basic)被传递给一个不接受它作为有效的方法   参数。

相反,您应该使用ArgumentException或您自己的子类。让我们说InvalidUserException或类似的东西。

Even msdn talks about

  

ArgumentNullException的行为与ArgumentException相同。它是   提供以便应用程序代码可以区分异常   由参数引起的空参数和异常引起的   不是空的。对于由非空的参数引起的错误

很明显,如果参数为null,则使用ArgumentNullExceptionArgumentException

那就是说,理想情况下,您甚至不应该允许某人使用无效的用户名创建User的实例。我确实设计了我的User课程,使其永远不会包含Name null

答案 1 :(得分:3)

如果参数为空,则应抛出ArgumentExceptionArgumentNullException仅应用于空参数:

if (string.IsNullOrWhiteSpace(user.Name))
    throw new ArgumentException("Username is empty", "user");