Using语句出现未处理的异常

本文关键字:异常 未处理 语句 Using | 更新日期: 2023-09-27 18:25:53

根据我在这里读到的内容,如果您在using语句中实例化某个东西,它应该会捕获任何异常并跳过代码块。我仍然看到未找到的文件发生未处理的异常:

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

我是误解了MSDN的文章,还是需要在编译器中设置一个开关?

Using语句出现未处理的异常

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将保持为null(未初始化),因此没有理由调用Dispose。但是想象一下,如果您有有效的文件路径,并且在sv.ReadLine().Split(k)[1];处得到一个异常,那么它将处理您的TextReader sv,并且该异常将在层次结构中向上传播,因为没有catch块。

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

using声明将使用Dispose关闭资源,而不管在块内抛出任何异常。它不会为您捕获异常。

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

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

看来你误解了这篇文章。