我创建了一个包含IP地址值的自定义 ConfigurationSection 。要从配置文件中正确获取值,需要创建 TypeConverter 来解析IP地址。用于此测试的配置文件如下。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="mike" type="CustomConfigSection.SiteConfig, CustomConfigSection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</configSections>
<mike IPAddress="192.168.0.1a" />
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
IPAddressConverter 使用try / catch来确定是否提供了无效的IP地址且无法解析。此时抛出 ArgumentException 。在 Open() 方法中,有一个围绕 的try / catch if(config.Sections [“mike”] == null) 即可。这是解析配置部分的第一个地方, IPAddressConverter 尝试转换配置值。
问题是Visual Studio声称用户代码中未处理 ArgumentException 。但是,根据调用堆栈,异常是在 Open() 方法中的try块的开头抛出的。
有谁知道这里发生了什么?为什么 Open() 方法中的捕获不能获得 ArgumentException ?
感谢您的帮助。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Net;
using System.ComponentModel;
namespace CustomConfigSection
{
public sealed class IPAddressConverter : ConfigurationConverterBase
{
public IPAddressConverter() { }
public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
string ipaddress = ((string)value).ToLower();
try
{
return IPAddress.Parse(ipaddress);
}
catch
{
throw new ArgumentException("The IPAddress contained invalid data. The IPAddress provided was '" + ipaddress + "'.");
}
}
public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
return value.ToString();
}
}
public class SiteConfig : ConfigurationSection
{
private SiteConfig() { }
#region Public Methods
public static SiteConfig Open()
{
if ((object)instance == null)
{
Configuration config = ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetEntryAssembly().Location);
try
{
if (config.Sections["mike"] == null)
{
instance = new SiteConfig();
config.Sections.Add("mike", instance);
config.Save(ConfigurationSaveMode.Modified);
}
else
instance = (SiteConfig)config.Sections["mike"];
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message.ToString());
System.Environment.Exit(-1);
}
}
return instance;
}
#endregion Public Methods
#region Properties
[ConfigurationProperty("IPAddress")]
[TypeConverter(typeof(IPAddressConverter))]
public IPAddress IPAddress
{
get { return (IPAddress)this["IPAddress"]; }
set { this["IPAddress"] = value; }
}
#endregion Properties
private static SiteConfig instance = null;
}
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Debug.WriteLine("Before Open.");
SiteConfig hi = SiteConfig.Open();
System.Diagnostics.Debug.WriteLine("After Open.");
hi.IPAddress = IPAddress.Parse("192.168.0.1");
}
}
}