我有以下代码:
SqlConnection ret = new SqlConnection(connectionString);
这会抛出一个ConfigurationException
但是,因为构造函数本身发生异常,ret
为空/未分配,所以我无法调用Dispose/Close
SqlConnection
的新实例。
因此,在将来的某个随机时间,将调用已创建(但未分配给Finalize
变量)ret
实例的SqlConnection
方法(最有可能来自单独的线程)抛出相同的ConfigurationException
但我无法捕获它,因为它发生在不同的线程上。这会降低整个应用程序。
处理这种情况的正确编码方法是什么?
P.S。例外是因为machine.config
文件中存在意外部分,但我们需要通过代码处理它,而不是要求客户修复machine.config
文件。
答案 0 :(得分:1)
我认为machine.config
文件中的问题意味着应用程序根本无法运行是合理的。如果您的系统范围配置中断,您(该配置损坏的所有者)应该修复它。并非所有失败都可以在代码中正确处理。
我建议不要尝试解决这个问题,但要尽早检测,然后尽可能干净地中止。如果您意识到这可能是一个问题,您可能希望显式检查它 - 以您可以找到的方式无错误 - 立即启动,并且失败并提供非常好的错误消息和建议。作为一个用户,我通常会在早期采取明确的步骤来解决问题,而不是试图跛行,但是由于处于一个基本的敌对环境中而做得很差。
你应还向Microsoft报告此问题,因为SqlConnection
终结器在构造函数甚至没有完成时抛出异常是非常讨厌的。