.NET: какое исключение выбрасывать, когда отсутствует необходимый параметр конфигурации?



вот стандартный сценарий:



if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"]))
throw new SomeStandardException("Application not configured correctly, bozo.");


проблема в том, что я не совсем уверен , который исключение SomeStandardException должно быть.



Я просмотрел структуру 3.5 и нашел двух вероятных кандидатов:ConfigurationException и ConfigurationErrorsException.




.Конфигурация.ConfigurationException

исключение, которое возникает, когда a
системная ошибка конфигурации имеет
произошло.




Примечания

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

Примечание:



The
поддерживается для обратной совместимости.
Этот ConfigurationErrorsException
объект заменяет его на
система конфигурации.




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



это подводит нас к тщательно головоломных ConfigurationErrorsException:




.Конфигурация.ConfigurationErrorsException


текущее значение не является одним из
EnableSessionState значения.




как вы можете видеть, его документация совершенно бесполезная. (Это так, как в локальной и онлайн-помощи.) Изучение самого класса показывает, что это радикальный перебор для того, что я хочу.



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



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



Изменить Дополнений



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



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

792   11  

11 ответов:

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

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

[Serializable]
public class ConfigurationMissingException : ConfigurationErrorsException
{}

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

UPDATE: я согласен с комментариями, поэтому я изменил подкласс на ConfigurationErrorsException от Exception. Я думаю, что обычно рекомендуется подкласс пользовательских исключений из существующих исключений платформы, где это возможно, избегая класса исключений, если вам не нужно исключение для конкретного приложения.

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

для меня ConfigurationException (и это замена, ConfigurationErrorsException-несмотря на вводящие в заблуждение документы MSDN) предназначены для ошибки в сбережений, чтение и т. д. конфигурации.

Как сказал Дэниел Ричардсон,ConfigurationErrorsException - это использовать. В общем случае рекомендуется создавать собственные типы исключений только в том случае, если у вас есть сценарий для их обработки. В случае ошибок конфигурации, которые обычно являются фатальными, это редко происходит, поэтому обычно более целесообразно повторно использовать существующий тип ConfigurationErrorsException.

до .NET 2.0, рекомендация была использовать

насчет системы.Конфигурация.SettingsPropertyNotFoundException?

ConfigurationErrorsException является правильным исключение, чтобы бросить в ситуации, которую вы описываете. Более ранняя версия документации MSDN для ConfigurationErrorsException имеет больше смысла.

http://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception(VS.80).aspx

предыдущее резюме MSDN и замечания:

  • исключение, которое возникает, когда a настройки-системная ошибка имеет произошло.
  • в ConfigurationErrorsException исключение выдается при любой ошибке происходит во время настройки информацию можно прочитать или написанный.

класс ConfigurationElement (который является базовым классом многих связанных с конфигурацией классов, таких как ConfigurationSection) имеет метод, называемый OnRequiredPropertyNotFound (есть и другие вспомогательные методы). Может быть, вы можете назвать их.

OnRequiredPropertyNotFound реализуется следующим образом:

protected virtual object OnRequiredPropertyNotFound(string name) {
    throw new ConfigurationErrorsException(SR.GetString("Config_base_required_attribute_missing", new object[] { name }), this.PropertyFileName(name), this.PropertyLineNumber(name)); }

Я бы пососал его и свернул свой собственный... но прежде чем вы это сделаете, возможно ли, чтобы система приняла значение по умолчанию для этого параметра конфигурации? Я обычно пытаюсь сделать это для каждой настройки, которая может быть пропущена bu Ops Management folk... (или, возможно, я должен сказать, для как можно большего количества настроек - для некоторых явно нецелесообразно, чтобы система принимала решение по умолчанию...)

В общем пользовательское исключение не много усилий... вот образец...

[Serializable]
public class MyCustomApplicationException : ApplicationException
{
    #region privates
    #endregion privates

    #region properties
    #endregion properties

    public MyCustomApplicationException (string sMessage,
        Exception innerException)
        : base(sMessage, innerException) { }
    public MyCustomApplicationException (string sMessage)
        : base(sMessage) { }
    public MyCustomApplicationException () { }

    #region Serializeable Code
    public MyCustomApplicationException (
       SerializationInfo info, StreamingContext context)
        : base(info, context) { }
    #endregion Serializeable Code
}

альтернативный метод, который вы могли бы использовать для ваших файлов конфигурации будет использовать пользовательские разделы конфигурации, а не AppSettings. Таким образом, вы можете указать, что свойство IsRequired и система конфигурации будет обрабатывать эту проверку для вас. Если свойство отсутствует он будет бросать ConfigurationErrorsException Так что я предполагаю, что поддерживает ответ, что вы должны использовать это исключение в вашем случае.

мое правило было:

  1. Если случай отсутствующей конфигурации не очень распространен, и я считаю, что никогда не захочу обрабатывать этот случай иначе, чем другие исключения, я просто использую базовый класс "Exception" с соответствующим сообщением:

    бросить новое исключение("мое сообщение")

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

Я склонен не соглашаться с предпосылкой вашего вопроса:

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

согласно документации MSDN на Система.Исключение (Исключение Класс, вы действительно не должны бросать исключения для ошибок ввода пользователя, по соображениям производительности (что было указано другими в Stack Overflow и в других местах). Это также имеет смысл - почему ваша функция не может вернуть false, если пользовательский ввод введен неправильно, а затем приложение изящно выходит? Это, кажется, больше проблема дизайна, чем проблема, с которой нужно бросить исключение.

Как и другие указал, если ты действительно есть чтобы создать исключение-по какой - либо причине-нет никаких причин, по которым вы не могли бы определить свой тип исключения, наследуя от System.Исключение.

вы можете попробовать наследовать исключение XML или просто использовать его.

Comments

    Ничего не найдено.