无效参数对的异常

时间:2014-02-07 18:09:24

标签: c# exception arguments argumentexception

当给出的参数无效时,接受多个参数的方法应抛出哪个异常

举个例子,考虑

public Bar DoSomething(Foo f1, Foo f2)
{
  //implementation...
}

完成操作取决于f1f2之间的某种关系或相似性(如果数组/集合,它们必须大小相同;如果是运动员,则必须在同一个团队中/反对的队伍;等等。)。

每个参数都是操作的有效参数,但它们不能同时有效。例如:

public MatchResult PlayMatch(Player a, Player b)
{
  if(a.Team == b.Team)
  {
    //Throw exception here, since players must be on different teams
  }

  //Play match, determine winner
}

抛出ArgumentException似乎不正确,因为它暗示其中一个参数无效,而不是一对参数一起无效。

2 个答案:

答案 0 :(得分:2)

您没有必要抛出异常。在我看来,这甚至不应该抛出异常,因为它是匹配逻辑的深层部分。我只是让匹配失败(返回零或你做的任何事情)而在文档中提到这个事实 - 比如“比较来自不同团队的两名球员”。这意味着比较来自同一团队的玩家将导致失败。

答案 1 :(得分:1)

ArgumentException在这里有意义,因为传入的参数有问题。你总是可以在throw语句中添加一条消息:

throw new ArgumentException("Players can't be on the same team!");

如果用户做错了,在这里抛出异常可能不是一个好主意。我个人认为异常应该实际捕获用户无法控制的情况(如文件读取中途失败),因此您可以优雅地使程序失败。您可以做的只是显示某种错误消息,返回null,并强制用户再次选择团队:

public MatchResult PlayMatch(Player a, Player b)
{
    if(a.Team == b.Team)
    {
        MessageBox.Show("Players must be on different teams!");
        return null;
    }

  //Play match, determine winner
}