在我们的应用程序中,我们有一个自定义配置,我们保存和阅读。我们的问题是:随着产品的发展,不再需要或重命名某些配置属性,或者其他任何配置属性。由我们产品的早期版本编写的文件中包含这些属性,因此在读取这些文件时会抛出异常(ConfigurationErrorsException)。
有没有办法捕获异常以便忽略未知属性?
这是我的意思的一个例子。如果我尝试阅读以下文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="MySettings" type="Config.MySettingsConfiguration, Config, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" allowExeDefinition="MachineToLocalUser" overrideModeDefault="Allow" restartOnExternalChanges="true" requirePermission="true" />
</configSections>
<MySettings>
<MyElement Bogus=""/>
</MySettings>
</configuration>
和&#34; Bogus&#34;未被定义为&#34; MyElement&#34;的属性,将抛出异常。我希望能够抓住这个例外并忽略&#34; Bogus&#34; (或者没有抛出异常)。
谢谢!
JAB
答案 0 :(得分:1)
通常情况下,这被证明是一个问题,这意味着您的部署实践并不好。您不应在已部署应用程序的配置文件中包含残留的,已弃用的配置值。准备进行配置转换和部署软件,包括配置文件,问题就会消失。
但是,您可以防止抛出异常并继续解析。
来自Creating Configuration Sections – P3.NET:
配置元素/部分公开了两个可覆盖的方法(OnDeserializeUnrecognizedAttribute和OnDeserializeUnrecognizedElement),如果解析在解析期间找到未知的元素/属性,则会调用这两个方法。这些方法可用于支持简单的动态解析。
对于未知属性,该方法获取已解析的名称和值。如果该方法返回true,则子系统假定该属性已被处理,否则抛出异常。
因此,当您知道不推荐使用它的属性时,请覆盖MySettings : ConfigurationElement
类中的ConfigurationElement.OnDeserializeUnrecognizedAttribute Method (String, String)
并返回true
。
这样的事情:
public class MySettings : ConfigurationElement
{
private string[] _deprecatedAttributes = new[] { "foo", "bar" };
protected override bool OnDeserializeUnrecognizedAttribute(string attribute, string value)
{
if (_deprecatedAttributes.Contains(attribute))
{
return true;
}
return base.OnDeserializeUnrecognizedAttribute(attribute, value);
}
}
您确实需要检查,并且您不能只为return true
获取所有属性,因为这会破坏对真正无效且永远无效的属性的验证。