如果我在try块内创建一个流并引发异常,那么流会自动被处理掉吗?例如:
try
{
Stream stream = response.GetResponseStream();
//Error Occurs
stream.Close();
}
catch
{
//Handle Error
}
Run Code Online (Sandbox Code Playgroud)
如果不是这样做的话,请你建议一个方法吗?
Blu*_*eft 15
不,你需要使用 finally
Stream stream;
try
{
stream = response.GetResponseStream();
//Error Occurs
}
catch
{
//Handle Error
}
finally
{
if(stream != null)
stream.Close();
}
Run Code Online (Sandbox Code Playgroud)
或者,将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
}
Run Code Online (Sandbox Code Playgroud)
请注意,我的两个示例并不完全等效 - 在第一个示例中,异常在steam.Close()调用之前处理,在第二个异常处理之后.
在这种情况下,流不会自动关闭.
如果您想确保在此上下文中关闭,您将需要使用finally以确保关闭.
或者,我将整个流包装在一个使用中.
using(Steam stream = response.GetResponseStream())
{
// Do your work here
}
Run Code Online (Sandbox Code Playgroud)
不,使用一个using块.即使发生错误,它也会在块完成时自动调用Dispose.
例如.
using (Stream stream = response.GetResponseStream())
{
// do something with stream
}
Run Code Online (Sandbox Code Playgroud)
它与以下相同:
Stream stream = null;
try
{
stream = response.GetResponseStream();
// do something with stream
}
finally
{
if (stream != null)
stream.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
网上有很多例子.一个快速的谷歌已经在stackoverflow上发布了以下内容: 'using'语句vs'try finally'
| 归档时间: |
|
| 查看次数: |
2337 次 |
| 最近记录: |