使用using语句的未处理异常

时间:2014-10-07 15:31:13

标签: c#

从我正在阅读的内容here如果你在using语句中实例化某些内容,那么它应该捕获任何异常并跳过代码块。我仍然看到未找到的文件发生未处理的异常:

        using (TextReader sv = File.OpenText(@"sv\.sv"))
        {
            char[] k = { ':' };
            lastWsp = sv.ReadLine().Split(k)[1];
        }

我是否误解了MSDN文章或者我是否需要在编译器中设置开关?

3 个答案:

答案 0 :(得分:5)

是的,你误解了这篇文章。

using声明资源将以Dispose关闭,无论块内是否抛出任何异常。它不会抓住你的例外。

答案 1 :(得分:5)

using转换为try-finally块,没有catch ,因此您误解了该文章。它不会catch任何异常,它只会确保在异常的情况下处置该对象。

在您的情况下,因为FileNotFound例外,您的对象将不会被初始化。

您的代码会转换为:

{
    TextReader sv = null;
    try
    {
        sv = File.OpenText(@"sv\.sv");
        char[] k = { ':' };
        lastWsp = sv.ReadLine().Split(k)[1];
    }
    finally
    {

        if(sv != null)
            sv.Dispose();
    }
}

在上述代码中,如果发生异常,它将尝试处理您的对象sv。但是异常仍然是未处理

由于在您的代码中,异常为FileNotFound,您的对象sv将保持为空(未初始化),因此没有理由调用Dispose 。但是想象一下,如果您有有效的文件路径,并且在sv.ReadLine().Split(k)[1];处获得异常,那么它将处置您的TextReader sv,并且该异常将在层次结构中向上传播,因为没有{ {1}}阻止。

答案 2 :(得分:2)

MSDN文章说,即使从使用块中抛出异常,您也可以保证在您的情况下调用.Dispose()对象sv。这就是所说的,除此之外,您还可以使用tryfinally获得有关如何实现这一目标的说明:

  

通过将对象放在try块中,然后在finally块中调用Dispose,可以获得相同的结果

所以你似乎误解了这篇文章。