如果我在try块内部创建了一个流并且引发了异常,那么流会自动被丢弃吗?例如:
try
{
Stream stream = response.GetResponseStream();
//Error Occurs
stream.Close();
}
catch
{
//Handle Error
}
如果不是这样做的话,请你建议一个方法吗?
答案 0 :(得分:15)
不,您需要使用finally
Stream stream;
try
{
stream = response.GetResponseStream();
//Error Occurs
}
catch
{
//Handle Error
}
finally
{
if(stream != null)
stream.Close();
}
或者,将Stream
声明/定义包含在using
语句中,该语句会自动调用Close()
:
try
{
using(Stream stream = response.GetResponseStream())
{
//Error happens
}
//stream.Dispose(), which calls stream.Close(), is called by compiler here
}
catch
{
//Handle Error
}
请注意,我的两个示例不是完全等效 - 在第一个示例中,异常在调用steam.Close()
之前处理,在第二个异常处理之后。
答案 1 :(得分:5)
在这种情况下,流不会自动关闭。
如果您想确保在此上下文中关闭,您需要使用finally
来确保关闭。
或者我将整个流包装在一个使用中。
using(Steam stream = response.GetResponseStream())
{
// Do your work here
}
答案 2 :(得分:5)
不,使用using
块。即使发生错误,它也会在块完成时自动调用Dispose。
例如。
using (Stream stream = response.GetResponseStream())
{
// do something with stream
}
它与:
相同Stream stream = null;
try
{
stream = response.GetResponseStream();
// do something with stream
}
finally
{
if (stream != null)
stream.Dispose();
}
网上有很多例子。一个快速的谷歌在stackoverflow上发现了以下内容:'using' statement vs 'try finally'
答案 3 :(得分:3)
using (Stream stream = response.GetResponseStream())
{
}
在范围退出时调用 Dispose()
。这是确保清除IDisposable
个对象的正确习惯用法。
答案 4 :(得分:2)
使用(资源)语句将负责调用dispose。
答案 5 :(得分:1)
答案是否定的。如果你的代码周围有一些异常处理逻辑,最好关闭finally
块中的所有资源。
答案 6 :(得分:1)
不,为了始终确保处置,无论例外,您使用:
try
{
Stream stream = response.GetResponseStream();
//Error Occurs
}
catch
{
//Handle Error
}
finally
{
if(stream!=null)
stream.Close();
}
或简单地说:
using (Stream stream = response.GetResponseStream())
{
}
答案 7 :(得分:1)
Stream实现IDisposable接口。 您可以使用类(实现IDisposable)的using()语句。 这将自动处理关闭和处理对象,而无需最终写入。
try
{
using (var stream = response.GetResponseStream())
{
//Error happens
}
}
catch
{
//Handle Error
}