gpt4 book ai didi

c# - 如何/在何处处理 Windows 服务中的 ConfigurationErrorsException?

转载 作者:太空宇宙 更新时间:2023-11-03 16:58:13 27 4
gpt4 key购买 nike

我有一个具有自定义配置部分的 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 中,但没有效果。

谢谢。

最佳答案

或者更好(因为您可能需要多个这样的属性),使用来自@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:您可以 Hook AppDomain.UnhandledException event在配置部分处理程序的静态构造函数中。静态构造函数在访问类的任何实例或静态成员之前运行,因此它保证即使您的服务的主要方法尚未被调用,您也能拦截异常。

然后,当您拦截并记录错误时,您可以使用一些错误代码退出服务!= 0 ( Environment.Exit(errorCode) ),因此服务管理器知道它失败了,但不会尝试调用调试器.

关于c# - 如何/在何处处理 Windows 服务中的 ConfigurationErrorsException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/474047/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com