Закрытие потока после исключения

Я открываю поток и затем десериализовываю данные в потоке. Однако я добавил участника к объекту SavedEventSet поэтому теперь, когда я пытаюсь открыть старый файл, он выдает исключение на строке десериализации.

Это меня устраивает (на данный момент), но проблема состоит в том, что я обрабатываю исключение, но никогда не закрываю поток (потому что исключение произошло, прежде чем я закрою поток), поэтому когда я попытаюсь открыть файл снова, это не позволит мне, потому что это используется.

Как я закрываю поток после этого исключения? Если я поместил поток. Близко () или в выгоде или в наконец, это жалуется на попытку получить доступ к неприсвоенной локальной переменной. Походит на плохую практику, чтобы просто открыть случайный файл, который я знаю, там. Там какой-либо путь состоит в том, чтобы открыть поток способом, который был бы подобен пустому конструктору, таким образом, будет похоже, что он присвоен?

Спасибо

SavedEventSet sES;
OpenFileDialog oFD = new OpenFileDialog();
Stream stream;
BinaryFormatter bF;

try
{
    oFD.InitialDirectory = this.path;
    oFD.Title = "Open Event Saved File.";
    oFD.ShowDialog();

    if(oFD.FileName.Contains(".sav"))
    {
        stream = File.Open(oFD.FileName, FileMode.Open);
        bF = new BinaryFormatter();

        sES = (SavedEventSet)bF.Deserialize(stream);
        stream.Close();

    }
}
catch (Exception ex)
{
    stream.Close();
    /*handle Exception*/
}
12
задан EatATaco 21 January 2010 в 22:24
поделиться

4 ответа

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

using(Stream stream = File.Open(oFD.FileName, FileMode.Open))
{
    bF = new BinaryFormatter();

    sES = (SavedEventSet)bF.Deserialize(stream);
}
27
ответ дан 2 December 2019 в 04:02
поделиться

Используйте окончательно Блок, это будет выполнять, произошло ли исключение или нет:

try
{
  oFD.InitialDirectory = this.path;
  oFD.Title = "Open Event Saved File.";
  oFD.ShowDialog();

  if(oFD.FileName.Contains(".sav"))
  {
    stream = File.Open(oFD.FileName, FileMode.Open);
    bF = new BinaryFormatter();

    sES = (SavedEventSet)bF.Deserialize(stream);
  }
}
catch (Exception ex)
{
  /*handle Exception*/
}
finally
{
  if (stream != null)
    stream.Close();
}
4
ответ дан 2 December 2019 в 04:02
поделиться
SavedEventSet sES; 
OpenFileDialog oFD = new OpenFileDialog(); 
BinaryFormatter bF; 

try 
{ 
    oFD.InitialDirectory = this.path; 
    oFD.Title = "Open Event Saved File."; 
    oFD.ShowDialog(); 

    if(oFD.FileName.Contains(".sav")) 
    { 
        using(Stream stream = File.Open(oFD.FileName, FileMode.Open))
        {
           bF = new BinaryFormatter(); 

           sES = (SavedEventSet)bF.Deserialize(stream); 
           stream.Close(); 
        }
    } 
} 
catch (Exception ex) 
{ 
    /*handle Exception*/ 
} 
0
ответ дан 2 December 2019 в 04:02
поделиться

Установите поток на ноль перед пробным блоком.

В вашем catch check if stream is not null, if not then close the stream.

  SavedEventSet sES;
  OpenFileDialog oFD = new OpenFileDialog();
  Stream stream = null;
  BinaryFormatter bF;

  try
  {
    oFD.InitialDirectory = this.path;
    oFD.Title = "Open Event Saved File.";
    oFD.ShowDialog();

    if (oFD.FileName.Contains(".sav"))
    {
      stream = File.Open(oFD.FileName, FileMode.Open);
      bF = new BinaryFormatter();

      sES = (SavedEventSet)bF.Deserialize(stream);
      stream.Close();

    }
  }
  catch (Exception ex)
  {
    if (stream != null)
      stream.Close();
    /*handle Exception*/
  }
6
ответ дан 2 December 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: