使用初始化的内部异常

本文关键字:内部 异常 初始化 | 更新日期: 2023-09-27 18:35:44

我在 C# 中阅读了许多关于 using 关键字的帖子,但我找不到有相同问题的人。阅读这篇有趣的文章,它说 using 语句基本上等同于 try/catch 块:

MyResource myRes= new MyResource();
try
{
    myRes.DoSomething();
}
finally
{
    // Check for a null resource.
    if (myRes!= null)
        // Call the object's Dispose method.
        ((IDisposable)myRes).Dispose();
}

真正让我发疯的是,对象初始化myRes= new MyResource()仍然在 try/catch 块之外,所以如果在初始化过程中出现问题(哦,确实如此!除了使用普通的 try/catch 块之外,我没有其他方法可以处理它。

这是正确的还是我错过了什么?在我看来,这使得using陈述的意义部分无用。

我也尝试了这样的事情:

using (MyResource myRes)
{
    myRes = new MyResource();
    myRes.DoSomething();
}

但是编译器不喜欢这样,因此不可能将初始化带到 try 块中。

这对我来说似乎很奇怪,我想我一定错过了什么。谁能解释一下这背后的原因?

使用初始化的内部异常

如果构造函数失败,将抛出异常而不是返回引用 - 因此调用代码没有任何要处理的内容。

基本上,构造函数需要小心。如果在异常中引发异常,构造函数需要确保没有资源泄漏,因为没有其他资源有机会清理。