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
翻译成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
。这就是它所说的,除此之外,还向您提供了如何使用try
和finally
:实现这一目标的说明
您可以通过将对象放入try块中,然后在finally块中调用Dispose来获得相同的结果
看来你误解了这篇文章。