C# ConfigurationConverterBase.ConvertFrom引发的ArgumentException正在转义try/catch
我已经创建了一个自定义的配置部分,其中包括一个IP地址值。为了正确地从配置文件中获取值,创建了一个类型转换器来解析IP地址。用于此测试的配置文件如下所示C# ConfigurationConverterBase.ConvertFrom引发的ArgumentException正在转义try/catch,c#,configuration,typeconverter,configurationsection,C#,Configuration,Typeconverter,Configurationsection,我已经创建了一个自定义的配置部分,其中包括一个IP地址值。为了正确地从配置文件中获取值,创建了一个类型转换器来解析IP地址。用于此测试的配置文件如下所示 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="mike" type="CustomConfigSection.SiteConfig, CustomCo
<?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>
即使您没有访问该属性本身,应用程序仍会在使其可用之前解析整个部分。解析发生在“config.Sections[“mike”]”处。但是,只有当您访问IPAddress属性时,才会出现异常。这回答了你的问题吗?@StfBln“只有当你访问IPAddress属性时,才会出现异常情况”。情况似乎并非如此。我在SiteConfig.Open()周围添加了一个try/catch,并在新行中添加了一个try/catch来访问IPAddress。在SiteConfig.Open期间发生异常。当访问IPAddress时,它不会“冒泡”。甚至VisualStudio编辑器调用堆栈也表示异常发生在SiteConfig.Open的config.Section[“mike”]中。当您运行代码时,是否发现异常发生在不同的位置?我的意思是,此异常是静默的,因为它不会冒泡。但是,在“SiteConfig hi=SiteConfig.Open();var test=hi.IPAddress;”中获取配置后,请尝试访问IPAddress;现在您将获得异常。@StfBln异常不是静默的。除了SiteConfig hi=SiteConfig.Open()之外,我已经注释掉了main中的所有内容。此方法调用失败。如果此方法对您成功,您使用什么来运行此代码?我刚刚将您的代码复制粘贴到一个空的控制台应用程序中,它可以正常工作。
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");
}
}
}