Закрытие потока после исключения
Я открываю поток и затем десериализую данные в потоке. Тем не менее, я добавил участника к объекту SavedEventSet, поэтому теперь, когда я пытаюсь открыть старый файл, он выдает исключение на линии десериализации.
Это нормально со мной (на данный момент), но проблема в том, что я обрабатываю исключение, но никогда не закрываю поток (поскольку исключение возникло до закрытия потока), поэтому, когда я пытаюсь открыть файл снова, это не позволит мне, потому что он используется.
Как закрыть поток после этого исключения? Если я положу stream.Close() в catch или, наконец, он жалуется на попытку доступа к неназначенной локальной переменной. Кажется, что плохая практика просто открывает случайный файл, который я знаю, есть. Есть ли способ открыть поток таким образом, который будет похож на пустой конструктор, чтобы он выглядел так, как будто он назначен?
Спасибо
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*/
}
Ответы
Ответ 1
Вы можете использовать используя блок, который автоматически закроет поток, даже если есть исключение:
using(Stream stream = File.Open(oFD.FileName, FileMode.Open))
{
bF = new BinaryFormatter();
sES = (SavedEventSet)bF.Deserialize(stream);
}
Ответ 2
Установить поток до нуля до блока try.
В вашей проверке catch, если поток не равен NULL, если нет, то закройте поток.
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*/
}
Ответ 3
Используйте блок finally, это приведет к возникновению исключения или нет:
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
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*/
}