据我所见,ArgumentExceptions通常是这样使用的:
public void UpdateUser(User user)
{
if (user == null) throw new ArgumentException("user");
// etc...
}但如果我有这样的东西
public void UpdateUser(int idOfUser)
{
var user = GetUserById(idOfUser);
if (user == null) throw new ArgumentException("idOfUser");
// etc...
}那还是ArgumentException吗?
发布于 2015-06-22 14:15:03
顾名思义,ArgumentException是一个参数的例外。这意味着这个论点在本质上是错误的。
一般形式是:
public void SomeMethod(SomeType arg)
{
if(!TestArgValid(arg))
throw new ArgumentException("arg"); //Or more specific is possible
//e.g. ArgumentNullException
/* Actually do stuff */
}如果,,,,GetUserById可能会失败的方法是,idOfUser的值存在本质上的错误,那么在实践中,以下两种方法都是相同的:
public void UpdateUser(int idOfUser)
{
if(!TestValid(idOfUser))
throw new ArgumentException("idOfUser");
var user = GetUserById(idOfUser);
// Do stuff with user
}
public void UpdateUser(int idOfUser)
{
var user = GetUserById(idOfUser);
if(user == null)
throw new ArgumentException("idOfUser");
// Do stuff with user
}如果由于某种原因,在事实发生后测试user的速度更快或者更少,如果没有副作用的话,测试的速度更快或者更少--如果调用GetUserById没有副作用,那么E 118可能是E 219的话,第二个版本将是第一个版本的合理优化。
但是,只有当以上所有的_if_s都成立时,这才能成立,这是一种奇怪的检测无效参数的方法,它有一些特殊的优势,我们可以从方法的封装中受益,将这种奇怪之处隐藏在其他任何东西上。
有可能有一个有效的idOfUser,但是没有对应的user,在这种情况下,它肯定不是一个参数异常。
发布于 2015-06-22 13:23:59
第一个
if (user == null) throw new ArgumentException("user");应该是
if (user == null) throw new ArgumentNullException("user");如果可能,您不应该直接抛出ArgumentException
ArgumentException的主要派生类是ArgumentNullException和ArgumentOutOfRangeException。应该使用这些派生类而不是ArgumentException,除非在两个派生类都不可接受的情况下。
对于第二个例子,这里是他们建议的Should I throw a KeyNotFoundException for a database lookup? (在注释中)
if (user == null) throw new ObjectNotFoundException();它在System.Data:System.Data.ObjectNotFoundException中定义。
https://stackoverflow.com/questions/30980966
复制相似问题