Исключение, чтобы бросить, когда внутренние аргументы недействительны - PullRequest
0 голосов
/ 09 ноября 2018

Я спрашивал себя об этом много раз, но до сего дня я не нашел хорошего ответа.Какое правильное исключение выдается, если вы понимаете, что в аргументе, переданном вашему методу, есть недопустимое состояние, например, если мне нужно убедиться, что определенное поле установлено внутри параметра.Взгляните на следующий пример:

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 и чувствую необходимость описать проблему в сообщении об исключении.

Поэтому мой вопрос заключается в том, каков наилучший способ обработки случаев, подобных приведенному выше, если не сам аргументно его содержимое в недопустимом состоянии?

1 Ответ

0 голосов
/ 09 ноября 2018

Я думаю, что именно здесь вы должны использовать параметры исключения для предоставления дополнительной детализации.

if (parameter.Field is null)
{
    throw new ArgumentException("Field is null", "parameter"); // what to throw here?
}

Или изменить функцию, чтобы она принимала только этот параметр, а не весь объект.Тогда будет уместно ArgumentNullException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...