Должен ли я бросить ArgumentNullException, если строка пуста? - PullRequest
52 голосов
/ 31 августа 2009

Я работаю над методом, который делает что-то с заданным строковым параметром. Допустимое значение для строкового параметра - любое другое значение, кроме null или string.Empty. Итак, мой код выглядит следующим образом.

private void SomeMethod(string someArgument)
{
    if(string.IsNullOrEmpty(someArgument))
        throw new ArgumentNullException("someArgument");

    // do some work
}

Ничего особенного. Мой вопрос, это нормально, чтобы генерировать ArgumentNullException, даже если строка равна string.Empty? Потому что технически это не ноль. Если вы считаете, что не следует выдавать ArgumentNullException, какое исключение следует выдать?

Ответы [ 6 ]

37 голосов
/ 31 августа 2009

ArgumentException должно быть выброшено для случая String.Empty. Это указывает на проблему, отличную от нулевой. Чтобы избежать NullReferenceException, сначала я проверяю нулевое значение, а затем обрезаю и проверяю наличие пустого регистра, чтобы предотвратить пропуск пустого пространства.

private void SomeMethod(string someArgument)
{
    if(someArgument == null)
        throw new ArgumentNullException("someArgument");

    if (someArgument.Trim() == String.Empty)
        throw new ArgumentException("Input cannot be empty", "someArgument");

    // do some work
}

Начиная с .NET 4.0, вы можете использовать метод String.IsNullOrWhiteSpace для выполнения этих проверок за один раз. Тем самым вы отказываетесь от возможности указать тип детализированного исключения, поэтому я бы выбрал ArgumentException и обновил сообщение соответствующим образом.

5 голосов
/ 31 августа 2009

Вы должны бросить ArgumentException, если пустая строка не является допустимым вводом для вашего метода. Клиенты могут очень запутаться, если вы выбросите ArgumentNullException, в то время как они не предоставили аргумент null.

Это просто другой вариант использования. У вас также могут быть методы, которые не принимают нулевые входные значения, но принимают пустые строки. Важно быть последовательным во всем приложении.

4 голосов
/ 31 августа 2009

Принимая во внимание все сказанное (Джо / Ахмад Магид), я бы тогда создал исключение для этого случая.

class ArgumentNullOrEmptyException : ArgumentNullException
2 голосов
/ 31 августа 2009

ArgumentNullException иногда используется в .NET Framework для случая String.IsNullOrEmpty - например, System.Windows.Forms.Clipboard.SetText.

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

Обратите внимание, что это и другие исключения, полученные из ArgumentException, обычно указывают на ошибку программирования, и, следовательно, необходимо предоставить информацию, необходимую для помощи разработчику в диагностике проблемы. Лично я думаю, что маловероятно, что разработчик смущает, если вы используете ArgumentNullException для пустого строкового аргумента, особенно если вы документируете это поведение, как в примере ниже.

/// <summary>
/// ... description of method ...
/// </summary>
/// <param name="someArgument">... description ...</param>
/// <exception cref="ArgumentNullException">someArgument is a null reference or Empty.</exception>
public void SomeMethod(string someArgument)
{
   ...
}
0 голосов
/ 11 октября 2010

Почему бы не использовать этот код?

private void SomeMethod(string someArgument)
{
//chek only NULL
if(ReferenceEquals(someArgument,null))
    throw new ArgumentNullException("someArgument");

// and after trim and check
if (someArgument.Trim() == String.Empty)
    throw new ArgumentException("Input cannot be empty", "someArgument");

// do some work
}
0 голосов
/ 31 августа 2009

Это действительно зависит от обстоятельств.

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

class StringEmptyOrNullException : Exception
{
}

Где вы также можете добавить свои собственные конструкторы и добавленную информацию и т. Д.

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

Надеюсь, это поможет,

Кайл

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