Исключение для неверной пары аргументов
Какое исключение должно быть вызвано методом, который принимает несколько аргументов, когда данные аргументы недопустимы, если даны вместе?
В качестве примера рассмотрим
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
кажется неверным, поскольку подразумевает, что один из аргументов недопустим, а не то, что пара аргументов вместе недопустима.
2 ответа
Вам не нужно обязательно бросать исключение. На мой взгляд, это даже не должно создавать исключение, потому что является глубокой частью вашей логики сопоставления. Я бы просто допустил сбой сопоставления (вернул ноль или что бы вы ни делали) вместо этого и упомянул этот факт в документации - что-то вроде "Сравнение двух игроков из разных команд" Это означает, что сравнение игроков из одной команды приведет к провалу.
ArgumentException будет иметь здесь смысл, поскольку в передаваемых аргументах что-то не так. Вы всегда можете добавить сообщение в свой оператор throw:
throw new ArgumentException("Players can't be on the same team!");
Вероятно, не стоит создавать исключение, если пользователь сделал что-то не так. Я лично считаю, что исключения должны на самом деле отлавливать случаи, которые пользователь не может контролировать (например, чтение файла не удается на полпути), поэтому вы можете корректно завершить работу программы. Вы можете просто показать какое-то сообщение об ошибке, вернуть ноль и заставить пользователя снова выбирать команды:
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
}