Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlConnection构造函数中的异常导致finalize中的异常_C#_.net_Dispose_Sqlconnection_Finalizer - Fatal编程技术网

C# SqlConnection构造函数中的异常导致finalize中的异常

C# SqlConnection构造函数中的异常导致finalize中的异常,c#,.net,dispose,sqlconnection,finalizer,C#,.net,Dispose,Sqlconnection,Finalizer,我有以下代码: SqlConnection ret = new SqlConnection(connectionString); 这会抛出一个ConfigurationException,我捕获到了该异常,但是,由于异常发生在构造函数本身,ret为空/未分配,因此我无法对SqlConnection的新实例调用Dispose/Close 因此,在将来的某个随机时间,将调用已创建(但未分配给ret变量)SqlConnection实例的Finalize方法(很可能来自单独的线程)它抛出相同的Conf

我有以下代码:

SqlConnection ret = new SqlConnection(connectionString);
这会抛出一个
ConfigurationException
,我捕获到了该异常,但是,由于异常发生在构造函数本身,
ret
为空/未分配,因此我无法对
SqlConnection
的新实例调用
Dispose/Close

因此,在将来的某个随机时间,将调用已创建(但未分配给
ret
变量)
SqlConnection
实例的
Finalize
方法(很可能来自单独的线程)它抛出相同的
ConfigurationException
,但我无法捕获它,因为它发生在不同的线程上。这会使整个应用程序宕机

处理这种情况的正确编码方法是什么


另外,例外是因为
machine.config
文件中有一个意外的部分,但是我们需要通过代码来处理它,而不是要求客户修复
machine.config
文件。

我认为
machine.config
文件中的问题意味着应用程序根本无法运行是合理的。如果您的系统范围配置损坏,您(该损坏配置的所有者)应该修复它。并非所有故障都能在代码中正确处理

我建议不要尝试解决这个问题,而是尽早发现它,并尽可能以干净的方式中止。如果您意识到这可能是一个问题,那么您可能希望在启动时立即显式地检查它(以您可以找到的一种无错误的方式),并以一条非常好的错误消息和建议失败。作为一个用户,我通常更希望一些事情在早期失败,并有明确的步骤来解决问题,而不是试图一瘸一拐地继续下去,但由于处于一个根本不友好的环境中,所以做得很差


您还应该向Microsoft报告这个问题,因为当构造函数甚至没有完成时,
SqlConnection
终结器抛出异常是非常棘手的。

非常棘手的情况。您知道为什么首先会发生ConfigurationException吗?您是否也尝试过将代码包装到using{}块中?这不是因为
ret
为null,而是因为它从未被分配任何内容。当您谈到“实例的Finalize方法”时,您是指
SqlConnection
的finalizer,还是指您自己的类的finalizer?如果它是
SqlConnection
的终结器,那就是
SqlConnection
本身的一个bug。如果是你的终结器,那就是你的bug。。。我们需要更多的上下文。@JonSkeet-调用SQLConnection的终结器。我已经用这个和一些关于异常的更多信息编辑了这个问题。发布连接字符串。您正在使用的sql Server版本。调用堆栈也会有所帮助。在多个线程上共享单个
SqlConnection
不是很安全。