C# 为什么连接失败时会重用SqlException

C# 为什么连接失败时会重用SqlException,c#,exception,sqlexception,C#,Exception,Sqlexception,在以下代码中,连接字符串密码故意不正确,导致打开连接时发生SqlException while (true) { try { SqlConnection conn = new SqlConnection("Server=localhost;Database=northwind;UID=sa;PWD=b;"); conn.Open();

在以下代码中,连接字符串密码故意不正确,导致打开连接时发生SqlException

        while (true)
        {
            try
            {
                SqlConnection conn = new SqlConnection("Server=localhost;Database=northwind;UID=sa;PWD=b;");
                conn.Open();
            }
            catch (Exception ex)
            {
                try
                {
                    Console.Write(ex.GetHashCode() + " : ");
                    ex.Data.Add("MyKey", "LogData");
                    Console.WriteLine(ex.Message);
                }
                catch (Exception ex2)
                {
                    Console.WriteLine(ex2.Message);
                }
            }
            Thread.Sleep(500);
        }
出于日志记录的目的,我想将值添加到异常的数据字典中。在第一个异常之后,我发现大多数后续异常都是SqlException类的完全相同的实例(用GetHashCode()验证),并且已经有了我的数据字典条目。这会导致由于密钥已存在而引发ArgumentException

34826618 : Login failed for user 'sa'.
34826618 : Item has already been added. Key in dictionary: 'MyKey'  Key being added: 'MyKey'
34826618 : Item has already been added. Key in dictionary: 'MyKey'  Key being added: 'MyKey'
34826618 : Item has already been added. Key in dictionary: 'MyKey'  Key being added: 'MyKey'
我意识到我可以将其更改为在数据属性上使用键控setter,这将添加或替换条目,但我担心的是重用可能会导致记录无效的数据条目。另外,从新代码执行中抛出的异常与先前抛出的异常是同一个实例,这似乎很奇怪

有什么见解吗?你能复制这个吗


另外,如果您认为向异常的数据字典中添加条目不合适,我很高兴听到您的想法,但这并没有改变为什么要重用SqlException实例的核心问题。

正如其他人所说,这可能与性能有关


为了解决您的问题,我建议您在记录完字典的内容或停止重新浏览字典时清除字典。

为什么不能是同一个实例?你有没有在任何地方读到它保证每次都是一个新实例?好吧,你不喜欢我的问题。事实上,我注意到这种行为是不相关的,这个问题仍然存在。我从来没有说过这是错误的,也没有说过我应该用不同的方式来运作。我注意到我(和其他人)认为奇怪的行为,并要求对其进行深入了解。也许有人能提供这种行为的逻辑原因。当然,欢迎你提问(我没有投反对票或反对票)。我只是假设答案是“因为我们喜欢它”,或者甚至“因为我们觉得它可能会提高性能”。这两个答案都没有太大的实用价值,也没有告诉您.NET的其他部分是否可能做不到同样的事情。我认为这是一个有价值的观察,因为它揭示了一些内在行为,这些行为在看到代码时即使不是意外的,也是不明显的。重新引发旧异常的新连接?奇怪的顺便说一句,刚找到。这似乎是前段时间报道的。