Какой тип исключения генерировать для строк - PullRequest
9 голосов
/ 19 января 2010

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

Мне всегда трудно выбирать типы исключений, потому что их так много. И это просто получение значения из web.config и проверка, вернул ли SandboxSoapApiUsername пустое значение.

if(string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername))
        throw new WTF do I throw here??? ahhh

Это, вероятно, зависит от использования / контекста, верно? Хорошо, я буду использовать возвращаемую строку, чтобы установить приватное поле класса. Поэтому мне нужно проверить, является ли эта строка пустой в начале процесса, а не позже (вместо того, чтобы полагаться на другой код для проверки свойства, связанного с приватным полем, я установлю для ConfigUtility.SandboxSoapApiUsername значение).

Поскольку свойства этого класса, которые я устанавливаю для каждого ConfigUtility.MEthodName, будут использоваться в запросе SOAP, я подумал, что, возможно, здесь будет уместно UriFormatException, даже если это не Uri?

Ответы [ 6 ]

11 голосов
/ 19 января 2010

Методы .NET Framework обычно различают null и недопустимое значение, переданное в качестве аргумента.Я думаю, вы должны выбросить исключение Argument Null, если значение равно null, и исключение Argument, если оно недопустимо.

if (arg == null)
    throw new ArgumentNullException("arg", "argcannot be null");
if (arg == string.Empty)
    throw new ArgumentException("arg cannot be an empty string", "arg");

Если значение не является аргументом, но, например, загружено во время инициализацииЯ думаю, что недопустимое исключение операции будет уместным:

if (string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername))
    throw new InvalidOperationException("Cannot initialize because " +
                                        "SandboxSoapApiUsername not configured");
10 голосов
/ 19 января 2010

Зависит от того, откуда взята строка.Аргумент может вызвать ArgumentNullException.Конфигурация может вызвать исключение ConfigurationException (что, по-видимому, применимо к этому случаю).Или, конечно, вы можете создать свой собственный в любом случае.

5 голосов
/ 19 января 2010

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

  1. * 1007 Исключение настройки *
    • Исключение, которое выдается при возникновении системной ошибки конфигурации.
  2. ArgumentException
    • Исключение, которое выдается, когда один из аргументов, предоставленных методу, недопустим.
  3. InvalidOperationException
    • Исключение, которое выдается, когда вызов метода недопустим для текущего состояния объекта.

1)
Возможно, это не имеет смысла, если вы не выберете параметр из app.config или web.config:

Исключение ConfigurationException бросается, если приложение пытается читать или записывать данные в файл конфигурации, но есть безуспешными. Некоторые возможные причины для этого может включать в себя искаженный XML в файл конфигурации, файл вопросы разрешения и конфигурации свойства со значениями, которые не являются действительный.

2)
Это не аргумент, поэтому в этом нет особого смысла.

3) * * тысяча сорок один Это лучший из трех, так как объект будет в недопустимом состоянии. Однако в зависимости от того, насколько велик ваш набор параметров конфигурации, я бы предпочел сделать свое собственное исключение, полученное из System.Exception.

Есть две школы мысли, из которых можно извлечь - System.Exception и ApplicationException*. Два разных разработчика в команде фреймворка выразили разные взгляды, от которых, по их мнению, вы должны унаследовать.

Если все вышеперечисленное звучит как woffle, тогда вы можете просто выбрать тот, который, по вашему мнению, наиболее актуален из списка .

* Похоже, MSDN теперь согласен с разработчиками своего фреймворка, что ApplicationException была ошибкой проектирования

4 голосов
/ 19 января 2010

вам нужно исключение InvalidConfiguration - определите одно

 throw new InvalidConfigurationException("Must supply user name")
1 голос
/ 19 января 2010

Если он передан в качестве аргумента, выведите ArgumentNullException .

В противном случае, это действительно зависит от того, что означает строка null в контексте вашего приложения. Не бойтесь определять пользовательские типы исключений, если в базовом фреймворке для сценария нет чего-либо.

0 голосов
/ 19 января 2010

Поскольку кажется, что что-то настроено неправильно, я бы предложил System.Configuration.ConfigurationErrorsException .

Примечание: не используйте System.Configuration.ConfigurationException . Это более старая версия, и она устарела.

Примечание 2. Хотя я на 90% уверен, что мы имеем дело с отсутствующим значением конфигурации, если отсутствует параметр метода, выведите ArgumentException или ArgumentOutOfRangeException .

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