Бросать ArgumentNullException в конструктор? - PullRequest
50 голосов
/ 02 сентября 2010

Для конструктора с одним параметром, нормально ли создавать исключение ArgumentNullException внутри конструктора, если параметр имеет значение null / empty? ИЛИ, должно ли оно быть добавлено в метод, который фактически использует аргумент? Спасибо.

Ответы [ 4 ]

53 голосов
/ 02 сентября 2010

Да, если это абсолютно необходимо, тогда выведите исключение.Вы не должны * выбросить исключение позже.

Всегда помните «Принцип раннего провала» .В настоящее время концепция проваливается, поэтому вы не тратите время на отладку и не испытываете неожиданные функциональные возможности системы.

В качестве альтернативы вы можете также вызвать ArgumentException для "" и ArgumentNullException для нулевого значения.В любом случае убедитесь, что вы выдаваете действительное сообщение об исключении.


Всегда хорошая справочная статья для управления исключениями: Хорошие правила управления исключениями Thumb


Заметка о том, что сказал @Steve Michelotti (потому что я большой поклонник CodeContracts)

Contract.Requires<ArgumentNullException>(inputParemeter!= null, "inputparameter cannot be null");
Contract.Requires<ArgumentException>(inputParemeter!= "", "inputparameter cannot be empty string");

альтернативно

Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(inputParemeter), "inputparameter cannot be null or empty string");
17 голосов
/ 02 сентября 2010

Бросить его в конструктор - это нормально - в среде .NET есть несколько классов, которые делают это. Кроме того, проверьте код контрактов для этого.

4 голосов
/ 02 сентября 2010

Исходя из того, как это звучит, вы передаете параметр в конструктор, который будет храниться классом для использования в каком-то другом методе позже. Если вы на самом деле не используете аргумент в конструкторе, вам, вероятно, следует подумать о том, чтобы переместить аргумент в качестве параметра метода, который фактически использует его.

1 голос
/ 02 сентября 2010

Я бы поставил проверку в свойстве, которое вы устанавливаете при вызове конструктора ... Таким образом, исключение будет выброшено во всех случаях.

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