Утилизируются ли потоки автоматически в операторе try / catch? - PullRequest
4 голосов
/ 20 июня 2011

Если я создаю поток внутри блока try и возникает исключение, поток автоматически удаляется?Например:

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

Если это не способ сделать это, можете ли вы предложить подход?

Ответы [ 8 ]

15 голосов
/ 20 июня 2011

Нет, вам нужно использовать 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(), во втором исключение обрабатывается после.

5 голосов
/ 20 июня 2011

Нет, используйте блок 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();
}

В сети много примеров.Быстрый Google обнаружил следующее уже в stackoverflow: 'использование' оператор против 'try finally'

5 голосов
/ 20 июня 2011

В этом случае поток не будет автоматически закрываться.

Если вы хотите, чтобы в этом контексте он закрывался, вы можете использовать finally для обеспечения закрытия.

В качестве альтернативы Iобернул бы весь поток в использование.

using(Steam stream = response.GetResponseStream())
{
 // Do your work here
}
3 голосов
/ 20 июня 2011
using (Stream stream = response.GetResponseStream())
{
}

Dispose() вызывается при выходе из области.Это правильная идиома для обеспечения очистки IDisposable объектов.

2 голосов
/ 20 июня 2011

using (resource) оператор позаботится о вызове dispose.

1 голос
/ 20 июня 2011

Stream реализует интерфейс IDisposable. Вы можете использовать операторы using (), где класс реализует IDisposable. Это автоматически позаботится о закрытии и удалении объекта без окончательной записи.

        try
        {
            using (var stream = response.GetResponseStream())
            {
                //Error happens
            }
        }
        catch
        {
            //Handle Error
        }
1 голос
/ 20 июня 2011

Нет, чтобы всегда гарантировать утилизацию, независимо от исключений, вы используете:

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

или просто:

using (Stream stream = response.GetResponseStream())
{   
}
1 голос
/ 20 июня 2011

Ответ - нет. Лучше закрыть все ресурсы в блоке finally, если у вас есть некоторая логика обработки исключений вокруг вашего кода.

...