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

Я понял, что вы можете сделать это с помощью Microsoft.AspNetCore.WebUtilities.QueryHelpers в пакете Microsoft.AspNetCore.WebUtilities .

Разбирать его в словаре:

var uri = new Uri(context.RedirectUri);
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);

Обратите внимание, что в отличие от ParseQueryString в System.Web это возвращает словарь типа IDictionary, поэтому значение представляет собой массив строк. Так как словарь обрабатывает несколько параметров строки запроса с тем же именем.

Если вы хотите добавить параметр в строку запроса, вы можете использовать другой метод в QueryHelpers:

var parametersToAdd = new System.Collections.Generic.Dictionary { { "resource", "foo" } };
var someUrl = "http://www.google.com";
var newUri = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(someUrl, parametersToAdd);

115
задан Jeff LaFay 8 October 2014 в 14:51
поделиться

10 ответов

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

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

[Serializable]
public class ConfigurationMissingException : ConfigurationErrorsException
{}

РЕДАКТИРОВАНИЕ: Запись Вашего собственного исключения в этом случае несет дополнительное преимущество гарантии, что никогда не будет никакого беспорядка относительно того, куда исключение прибывает из - платформа или Ваше приложение. Платформа никогда не будет выдавать Ваши пользовательские исключения.

ОБНОВЛЕНИЕ: Я соглашаюсь с комментариями, таким образом, я изменил подкласс на ConfigurationErrorsException от Исключения. Я думаю, что это обычно - хорошая идея разделить пользовательские исключения на подклассы из существующих исключений Платформы, если это возможно, избегая Класса исключений, если Вам не нужно специализированное исключение.

33
ответ дан Alexander Manekovskiy 24 November 2019 в 02:28
поделиться

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

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

44
ответ дан Mark Brackett 24 November 2019 в 02:28
поделиться

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

До.NET 2.0, рекомендация состояла в том, чтобы использовать Система. Конфигурация. ConfigurationException. ConfigurationException стал устаревшим в.NET 2.0 по причинам, которые никогда не были ясны мне и рекомендации, измененной для использования ConfigurationErrorsException.

я использую вспомогательный метод выдать исключение так, чтобы было легко изменить исключение, бросаемое в одно место при миграции от.NET 1.x к 2,0, или если Microsoft решает изменить рекомендацию снова:

if(string.IsNullOrEmpty(Configuration.AppSettings("foobar")))
{
   throw CreateMissingSettingException("foobar");
}

...

private static Exception CreateMissingSettingException(string name)
{
    return new ConfigurationErrorsException(
        String.Format
        (
        CultureInfo.CurrentCulture,
        Properties.Resources.MissingConfigSetting,
        name
        )
        );
}
17
ответ дан Joe 24 November 2019 в 02:28
поделиться

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

http://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception (По сравнению с 80) .aspx

более ранняя сводка MSDN и комментарии:

  • исключение, которое выдается, когда системная ошибка конфигурации произошла.
  • ConfigurationErrorsException исключение выдается, когда любая ошибка происходит, в то время как конфигурационная информация читается или пишется.
8
ответ дан Stephen Kennedy 24 November 2019 в 02:28
поделиться

Класс 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)); }
6
ответ дан Gaspar Nagy 24 November 2019 в 02:28
поделиться

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

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

[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
}
1
ответ дан Charles Bretana 24 November 2019 в 02:28
поделиться

Мое общее правило было бы:

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

    выдают новое Исключение ("мое сообщение здесь")

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

0
ответ дан Hershi 24 November 2019 в 02:28
поделиться

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

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

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

, Поскольку другие указали, если Вы действительно имеете к выданному исключение - по любой причине - нет никакой причины, почему Вы не могли определить свой Тип исключительной ситуации путем наследования Системе. Исключение.

0
ответ дан Matt Jordan 24 November 2019 в 02:28
поделиться

Вы могли попытаться наследоваться от Исключения XML, или просто использовать его.

-2
ответ дан StingyJack 24 November 2019 в 02:28
поделиться
15
ответ дан 24 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: