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

时间:2011-06-20 19:32:34

标签: c# .net try-catch

如果我在try块内部创建了一个流并且引发了异常,那么流会自动被丢弃吗?例如:

try
{
   Stream stream = response.GetResponseStream();
   //Error Occurs
   stream.Close();
}
catch
{
   //Handle Error
}

如果不是这样做的话,请你建议一个方法吗?

8 个答案:

答案 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
        }