2010-01-19 4 views
8

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

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

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

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

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

ответ

9

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

1

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

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

10

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

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

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

if (string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername)) 
    throw new InvalidOperationException("Cannot initialize because " + 
             "SandboxSoapApiUsername not configured"); 
+0

да, исключение аргумента легко. Это не аргумент, а скорее проверка возвращаемого значения из метода, прежде чем я установил некоторые свойства этого класса на возвращаемое значение. – PositiveGuy

4

вам необходимо исключение InvalidConfiguration - определить один

throw new InvalidConfigurationException("Must supply user name") 
+0

Верно, что лучше ожидать в коде конкретного, а не общего исключения.Есть вероятность, что что-то еще в этом методе может выдать исключение ArgNull или Arg ... –

+0

, но метод возвращает строку. Я предполагаю, что метод все равно может возвращать значение null, даже если его тип возврата является строкой, если, как вы говорите, что-то еще возвращает null в этом методе? – PositiveGuy

+0

, если вы бросаете, то ничего не возвращает. То, что бросает – pm100

0

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

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

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

+0

Intellisense не дает мне ConfigurationErrorsException как вариант исключения – PositiveGuy

+0

, поэтому я дал полный тип с пространством имен. Либо используйте * System.Configuration.ConfigurationErrorsException *, либо импортируйте/используйте «System.Configuration» в верхней части модуля. Итак, это недостаток конфигурации? Да, * ConfigurationErrorsException * - это путь. удачи! –

5

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

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

1)
Это, возможно, не имеет смысла, если вы не собирание установку из app.config или web.config:

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

2)
Это не аргумент, так это один не имеет особого смысла.

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

Существует две школы мысли о которых - System.Exception и ApplicationException *. Два разных разработчика в команде фреймворка выразили разные мнения, по которым, по их мнению, вам следует унаследовать, я придерживаюсь Jeffrey Richter's view.

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

* Похож MSDN в настоящее время согласуется с его рамками дэвов, что ApplicationException была дизайнерским ошибка, которую

Смежные вопросы