流是否在try/catch语句中自动处理?

Edw*_*ard 4 .net c# try-catch

如果我在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()调用之前处理,在第二个异常处理之后.


Jam*_*xon 5

在这种情况下,流不会自动关闭.

如果您想确保在此上下文中关闭,您将需要使用finally以确保关闭.

或者,我将整个流包装在一个使用中.

using(Steam stream = response.GetResponseStream())
{
 // Do your work here
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*ill 5

不,使用一个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'