Как / где обрабатывать ConfigurationErrorsException в службе Windows? - PullRequest
2 голосов
/ 23 января 2009

У меня есть служба Windows, в которой есть пользовательский раздел конфигурации. В классе configSectionHandler я использую атрибуты в свойствах для проверки настроек следующим образом:

    //ProcessingSleepTime Property
    [ConfigurationProperty("ProcessingSleepTime", DefaultValue = 1000, IsRequired = false)]
    [IntegerValidator(MinValue = 5, MaxValue = 60000)]
    public Int32 ProcessingSleepTime
    {
        get
        {
            if (this["ProcessingSleepTime"] == null)
                return 100;

            return (Int32)this["ProcessingSleepTime"];
        }
        set
        {
            this["ProcessingSleepTime"] = value;
        }
    }

Если значение в файле конфигурации не проходит проверку, выдается исключение ConfigurationErrorsException. В Windows-сервисе это происходит при попытке запуска, и это очень уродливо (предлагает запустить отладчик). Как я могу изящно справиться с этой ошибкой? Я попытался обернуть метод OnStart в try / catch, но он не дал эффекта.

Спасибо.

Ответы [ 3 ]

1 голос
/ 23 января 2009

Или еще лучше (поскольку вам может понадобиться несколько таких свойств), используя код из @Ricardo Villiamil, создайте:

int GetIntFromConfigSetting(string settingName, int defaultValue)
{
   int retValue = defaultValue;
   if(this.ContainsKey(settingName))
   {
      int sleepInterval;
      if(Int32.TryParse(this[settingName], out sleepInterval)
      {
         retValue = sleepInterval;
      }
   }
   return retValue;
}

Тогда используйте его из любого необходимого вам имущества.

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

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

И затем, когда вы перехватываете и регистрируете ошибку, вы можете выйти из службы с некоторым кодом ошибки! = 0 (Environment.Exit (errorCode)), чтобы диспетчер служб знал, что произошла ошибка, но не пытался вызвать отладчик. .

0 голосов
/ 24 января 2009

Хорошо, я думаю, у меня это есть. В моем сервисе у меня есть код, который выглядит следующим образом в конструкторе:

config = ConfigurationManager.GetSection ("MyCustomConfigSection") как MyCustomConfigSectionHandler;

Здесь выдается ошибка. Я могу поймать ошибку и зарегистрировать ее. Ошибка должна быть сброшена, чтобы предотвратить продолжение службы. Это по-прежнему вызывает уродливое поведение, но, по крайней мере, я могу зарегистрировать ошибку, информируя пользователя о том, почему служба не запустилась

0 голосов
/ 23 января 2009

Сначала проверьте, содержит ли ваша конфигурация ключ, который вы ищете, затем оберните его в try catch, затем проверьте, является ли оно действительным целым числом:

int retValue = 100;
if(this.ContainsKey("ProcessingSleepTime"))
{
    object sleepTime = this["ProcessingSleepTime"];
    int sleepInterval;
    if(Int32.TryParse(sleepTime.ToString(), out sleepInterval)
    {
       retValue = sleepInterval;
    }
}
return retValue;
...