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

Должен ли я вызывать ArgumentNullException, если строка пуста?

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

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

    // do some work
}

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

4b9b3361

Ответ 1

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

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 и соответствующим образом обновил сообщение.

Ответ 2

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

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

Ответ 3

Принимая во внимание все сказанное (Joe/Ahmad Mageed), я создавал бы исключение для этого случая.

class ArgumentNullOrEmptyException : ArgumentNullException

Ответ 4

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)
{
   ...
}

Ответ 5

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

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

class StringEmptyOrNullException : Exception
{
}

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

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

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

Кайл

Ответ 6

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

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
}