Должен ли я бросить ArgumentNullException, если строка пуста?
Я работаю над методом, который делает что-то с заданным строковым параметром. Допустимое значение для параметра string-это все, что угодно, кроме null или string.Пустой. Так что мой код выглядит так.
private void SomeMethod(string someArgument) { if(string.IsNullOrEmpty(someArgument)) throw new ArgumentNullException("someArgument"); // do some work }
ничего особенного там нет. Мой вопрос в том, можно ли бросить ArgumentNullException, даже если строка равна строке.Пусто? Потому что технически это не null. Если вы считаете, что он не должен бросать ArgumentNullException, какое исключение должно быть брошено?
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 }