当给出的参数无效时,接受多个参数的方法应抛出哪个异常?
举个例子,考虑
public Bar DoSomething(Foo f1, Foo f2)
{
//implementation...
}
完成操作取决于f1
和f2
之间的某种关系或相似性(如果数组/集合,它们必须大小相同;如果是运动员,则必须在同一个团队中/反对的队伍;等等。)。
每个参数都是操作的有效参数,但它们不能同时有效。例如:
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
似乎不正确,因为它暗示其中一个参数无效,而不是一对参数一起无效。
答案 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
}