我需要改进app.config文件中的错误报告。
我有一个很小的测试应用程序,其中包含“int”类型的设置。如果我将app.config中的值更改为不是有效整数的值,我会期望引发异常,我可以捕获并报告。不幸的是,有些东西正在吃异常。是否有一种直接的方法来阻止该行为并让异常传播出来?
我的Settings.Designer.cs文件(由Visual Studio生成):
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(
"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default { get { return defaultInstance; } }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("17")]
public int SecondSetting
{
get { return ((int)(this["SecondSetting"])); }
set { this["SecondSetting"] = value; }
}
}
我的C#测试应用:
static void Main (string[] args)
{
try
{
Console.WriteLine(AppConfigTests.Properties.Settings.Default.SecondSetting);
}
catch (Exception x)
{
Console.WriteLine(x.ToString());
}
}
我的App.config文件的相关部分(请注意该值不是有效整数):
<userSettings>
<AppConfigTests.Properties.Settings>
<setting name="SecondSetting" serializeAs="String">
<value>1foo7</value>
</setting>
</AppConfigTests.Properties.Settings>
</userSettings>
System.Number.StringToNumber会抛出一个System.Format异常,但有些东西正在抓住它并扔掉它,我的catch块永远不会被输入。在Visual Studio调试器输出中,我发现“在mscorlib.dll中发生了'System.FormatException'类型的第一次机会异常”,但除了进一步确认抛出异常之外,这对我没有帮助。
我尝试将IntegerValidatorAttribute添加到Settings.Designer.cs中的我的设置属性,但这没有帮助(我确保.cs没有重新生成)。
我尝试在main()方法的顶部添加以下代码,但这也无济于事:
foreach (SettingsProperty sp in AppConfigTests.Properties.Settings.Default.Properties)
sp.ThrowOnErrorDeserializing = true;
我想过实现自己的ConfigurationSection,但我希望有一个更简单的解决方案。
重申一下:我需要一种方法来报告app.config文件中设置值的错误。
(如果我在App.config中破坏XML语法(例如通过删除尖括号),我的catch块会得到一个很好的异常,其中包含我可能要求的所有细节。)
答案 0 :(得分:1)
您可以这样做(假设您在app.config中覆盖了所有设置值):
foreach (SettingsPropertyValue propertyValue in AppConfigTests.Properties.Settings.Default.PropertyValues) {
if (propertyValue.UsingDefaultValue) {
throw new Exception(propertyValue.Name + " is not deserialized properly.");
}
}
如果您正在编写Web应用程序,则在反序列化失败时触发此事件:
try {
if (this.IsHostedInAspnet()) {
object[] args = new object[] { this.Property, this, ex };
Type type = Type.GetType("System.Web.Management.WebBaseEvent, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", true);
type.InvokeMember("RaisePropertyDeserializationWebErrorEvent", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, args, CultureInfo.InvariantCulture);
}
}
catch {
}
否则,它只是回到默认值,所以只有你可以通过所有值迭代并检查它们是否没有默认值。