首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用ArgumentException?

正确使用ArgumentException?
EN

Stack Overflow用户
提问于 2015-06-22 13:16:27
回答 2查看 7.5K关注 0票数 12

据我所见,ArgumentExceptions通常是这样使用的:

代码语言:javascript
复制
public void UpdateUser(User user)
{
    if (user == null) throw new ArgumentException("user");
    // etc...
}

但如果我有这样的东西

代码语言:javascript
复制
public void UpdateUser(int idOfUser)
{
    var user = GetUserById(idOfUser);
    if (user == null) throw new ArgumentException("idOfUser");
    // etc...
}

那还是ArgumentException吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-22 14:15:03

顾名思义,ArgumentException是一个参数的例外。这意味着这个论点在本质上是错误的。

一般形式是:

代码语言:javascript
复制
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的值存在本质上的错误,那么在实践中,以下两种方法都是相同的:

代码语言:javascript
复制
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,在这种情况下,它肯定不是一个参数异常。

票数 1
EN

Stack Overflow用户

发布于 2015-06-22 13:23:59

第一个

代码语言:javascript
复制
if (user == null) throw new ArgumentException("user");

应该是

代码语言:javascript
复制
if (user == null) throw new ArgumentNullException("user");

如果可能,您不应该直接抛出ArgumentException

ArgumentException的主要派生类是ArgumentNullExceptionArgumentOutOfRangeException。应该使用这些派生类而不是ArgumentException,除非在两个派生类都不可接受的情况下。

对于第二个例子,这里是他们建议的Should I throw a KeyNotFoundException for a database lookup? (在注释中)

代码语言:javascript
复制
if (user == null) throw new ObjectNotFoundException();

它在System.DataSystem.Data.ObjectNotFoundException中定义。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30980966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档