从我正在阅读的内容here如果你在using语句中实例化某些内容,那么它应该捕获任何异常并跳过代码块。我仍然看到未找到的文件发生未处理的异常:
using (TextReader sv = File.OpenText(@"sv\.sv"))
{
char[] k = { ':' };
lastWsp = sv.ReadLine().Split(k)[1];
}
我是否误解了MSDN文章或者我是否需要在编译器中设置开关?
答案 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
。这就是所说的,除此之外,您还可以使用try
和finally
获得有关如何实现这一目标的说明:
通过将对象放在try块中,然后在finally块中调用Dispose,可以获得相同的结果
所以你似乎误解了这篇文章。