АргументException против ArgumentNullException?
Im рефакторинг кода и добавление метода, который заменит устаревший метод (скоро будущий). Новый метод имеет следующую подпись:
FooResult Foo(FooArgs args) { ... }
Устаревший метод содержит растущий список параметров. Эти параметры теперь являются свойствами класса FooArgs
. Устаревший метод имеет несколько условий защиты, которые проверяют нулевые значения со следующей структурой:
if (parameter1 == null)
throw new ArgumentNullException("parameter1");
if (parameter... == null)
throw new ArgumentNullException("parameter...");
if (parameterN == null)
throw new ArgumentNullException("parameterN");
Теперь, когда параметры были свернуты в класс FooArgs
, я должен бросить ArgumentNullException для отдельных свойств параметра FooArgs
:
if (args.Property1 == null)
throw new ArgumentNullException("args.Property1");
if (args.Property... == null)
throw new ArgumentNullException("args.Property...");
if (args.PropertyN == null)
throw new ArgumentNullException("args.PropertyN");
Или добавить более общее ArgumentException для параметра целиком FooArgs
:
if (args.Property1 == null)
throw new ArgumentException("Property1 cannot be null.", "args");
if (args.Property... == null)
throw new ArgumentException("Property... cannot be null.", "args");
if (args.PropertyN == null)
throw new ArgumentException("Property2 cannot be null.", "args");
Спасибо!
Ответы
Ответ 1
Вам нужно добавить чек, чтобы сами аргументы были не равными нулю. ANE не подходит для отдельных компонентов, поэтому вам нужно использовать более общие AE, например:
if (args == null)
throw new ArgumentNullException("args");
if (args.Property1 == null)
throw new ArgumentException("Property1 cannot be null.", "args");
if (args.Property... == null)
throw new ArgumentException("Property... cannot be null.", "args");
if (args.PropertyN == null)
throw new ArgumentException("Property2 cannot be null.", "args");
Ответ 2
Пока я полностью согласен с ответом dasblinkenlight, вы также можете рассмотреть возможность переноса проверки на FooArgs
в сам класс FooArgs
. Если этот класс специально предназначен для перемещения аргументов, скорее всего, он не допустим, чтобы он имел нулевые proeprties, и в этом случае я бы разрешил конструктору выполнять его проверку.
Ответ 3
В этом случае лучше всего проверить нулевую ссылку параметра FooArgs
внутри этого метода и выбросить ArgumentNullException
, если пустая ссылка была передана. Тогда, если другие методы или разделы кода используйте параметры, содержащиеся в классе args, они должны быть теми, кто проверяет это и бросает исключения по мере необходимости. Однако, если ваш метод, который принимает класс args ,, тот, который использует все аргументы, тогда лучше было бы проверить допустимые параметры в этом методе, как вы предложили.
Кроме того, используйте ArgumentNullException
только для аргументов, которые являются нулевыми ссылками. Если это просто недопустимое значение (например, пустая строка), вы должны использовать более общий ArgumentException
.
Ответ 4
Этот вид зависит от вашего инструментария и того, как вы относитесь к своей оснастке (resharper, fxcops и тому подобное). Некоторые статические инструменты анализа кода принимают это:
throw new ArgumentNullException("args.Property...","args");
и отклонить этот
throw new ArgumentNullException("args.Property...","args.Property");
Итак, если вы хотите использовать инструментарий, то утверждения null-hood относительно свойства параметра должны вызывать ArgumentException
Это также справедливо, чтобы просто сделать это, когда вы идете вперед. То, что когда-либо сообщало правильное сообщение разработчику обслуживания, чтобы помочь ему правильно передать параметры, является правильным сообщением.