Подтвердить что ты не робот

Аргумент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");

Спасибо!

4b9b3361

Ответ 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

Это также справедливо, чтобы просто сделать это, когда вы идете вперед. То, что когда-либо сообщало правильное сообщение разработчику обслуживания, чтобы помочь ему правильно передать параметры, является правильным сообщением.