为什么SqlException在连接失败时重用

Jos*_*ble 5 c# exception sqlexception

在以下代码中,连接字符串密码有意不正确,导致在打开连接时出现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);
        }
Run Code Online (Sandbox Code Playgroud)

出于日志记录的目的,我想将值添加到Exception的Data字典中.在第一个异常之后,我发现大多数后续异常都是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'
Run Code Online (Sandbox Code Playgroud)

我意识到我可以更改它以使用Data属性上的键控setter,这将添加或替换该条目,但我担心重用可能导致记录无效的数据条目.此外,从新代码执行抛出的异常与抛出的先前异常相同的实例似乎很奇怪.

任何见解?你能复制一下吗?

PS如果你不认为在Exception的数据字典中添加条目是合适的,我会很高兴听到你的想法,但它并没有改变关于为什么重用SqlException实例的问题的核心.

Med*_*noc 0

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

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