Я спрашивал себя об этом много раз, но до сего дня я не нашел хорошего ответа.Какое правильное исключение выдается, если вы понимаете, что в аргументе, переданном вашему методу, есть недопустимое состояние, например, если мне нужно убедиться, что определенное поле установлено внутри параметра.Взгляните на следующий пример:
public void DoSomethingElse(SomeObject parameter)
{
if (parameter.Field is null)
{
throw new ArgumentNullException(); // what to throw here?
}
}
Какое исключение я должен выбросить здесь?Это не ArgumentNullException
, потому что Аргумент не нулевой, но это поле.Также FxCop дает вам CA2208.Я думал о NotSupportedException
или InvalidOperationException
, но оба они в основном для других случаев использования и не подходят.Я обычно склоняюсь к простому ArgumentException
, но он не такой описательный, как ArgumentNullException, поэтому я должен предоставить более содержательное объяснение в сообщении об исключении.
Другим примером является следующий оператор switch.
public void DoSomething(SomeObject parameter)
{
switch(parameter.SomeEnum)
{
case SomeEnum.Value1:
// Do Something
break;
case SomeEnum.Value2:
// Do Something
break;
default:
throw new ArgumentOutOfRangeException(); // what to throw here?
}
}
Опять же, сам аргумент не вне диапазона, но его поле.Опять же, ArgumentOutOfRangeException является своего рода лучшим соответствием, но это все еще не аргумент, это проблема.В случае с переключателем IndexOutOfRangeException
на первый взгляд кажется подходящим, но мы не используем индекс.Поэтому я снова возвращаюсь к ArgumentException
и чувствую необходимость описать проблему в сообщении об исключении.
Поэтому мой вопрос заключается в том, каков наилучший способ обработки случаев, подобных приведенному выше, если не сам аргументно его содержимое в недопустимом состоянии?