从ConfigurationConverterBase.ConvertFrom抛出的ArgumentException正在转义try / catch

时间:2017-03-16 23:51:04

标签: c# configuration typeconverter configurationsection

我创建了一个包含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");
        }
    }
}

0 个答案:

没有答案