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


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

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

    // do some work
}

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

6 51

6 ответов:

ArgumentException должен быть брошен для String.Empty case. Это будет указывать на проблему, отличную от того, что она равна нулю. Чтобы избежать 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 и обновить сообщение соответственно.

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

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

class ArgumentNullOrEmptyException : ArgumentNullException

ArgumentNullException иногда используется в .NET Framework для строки.IsNullOrEmpty case-пример 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)
{
   ...
}

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

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

class StringEmptyOrNullException : Exception
{
}

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

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

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

Кайл

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

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
}