嵌套成员的ArgumentNullException

And*_*rei 4 .net c# 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));
}
Run Code Online (Sandbox Code Playgroud)

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

if (string.IsNullOrWhiteSpace(user.Name))
    throw new ArgumentNullException("user", "Username is empty");
Run Code Online (Sandbox Code Playgroud)

Sri*_*vel 8

不,你不应该为此目的抛出ArgumentNullException,因为它专门用于解决null引用.

null引用(在Visual Basic中为Nothing)传递给不接受它作为有效参数的方法时引发的异常.

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

即使是msdn谈论.

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

所以很明显,如果参数是null使用的ArgumentNullException,ArgumentException否则.

也就是说,理想情况下,您甚至不应允许某人User使用无效的用户名创建实例.我真的设计我的User班在这样一种方式,它永远不能包含Namenull.


Lee*_*Lee 5

ArgumentException如果参数为空,则应该抛出异常,ArgumentNullException只能用于空参数:

if (string.IsNullOrWhiteSpace(user.Name))
    throw new ArgumentException("Username is empty", "user");
Run Code Online (Sandbox Code Playgroud)