C# 在异常后关闭流
我打开一个流,然后反序列化流中的数据。但是,我向SavedEventSet对象添加了一个成员,因此现在当我尝试打开一个旧文件时,它会在反序列化行上抛出异常 这对我来说没问题(目前),但问题是我处理异常,但从不关闭流(因为异常发生在我关闭流之前),所以当我再次尝试打开文件时,它不会让我打开,因为它正在使用中 发生此异常后,如何关闭流?如果我将stream.Close()放在catch或finally中,它会抱怨试图访问未分配的局部变量。仅仅打开一个我知道存在的随机文件似乎是不好的做法。是否有任何方法可以以类似于空构造函数的方式打开流,使其看起来像是已分配的 谢谢C# 在异常后关闭流,c#,.net,stream,serialization,C#,.net,Stream,Serialization,我打开一个流,然后反序列化流中的数据。但是,我向SavedEventSet对象添加了一个成员,因此现在当我尝试打开一个旧文件时,它会在反序列化行上抛出异常 这对我来说没问题(目前),但问题是我处理异常,但从不关闭流(因为异常发生在我关闭流之前),所以当我再次尝试打开文件时,它不会让我打开,因为它正在使用中 发生此异常后,如何关闭流?如果我将stream.Close()放在catch或finally中,它会抱怨试图访问未分配的局部变量。仅仅打开一个我知道存在的随机文件似乎是不好的做法。是否有任何方
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*/
}
在try块之前将stream设置为null 在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*/
}
使用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();
}
您可以使用块,该块将自动关闭流,即使出现异常:
using(Stream stream = File.Open(oFD.FileName, FileMode.Open))
{
bF = new BinaryFormatter();
sES = (SavedEventSet)bF.Deserialize(stream);
}
我不明白为什么它一开始就不是空的。但是这很有效,谢谢:)我认为默认值是null,也就是说,您可以显式地分配null,以避免可能出现的编译器警告。
使用()时+1。在幕后,它编译成一个try/catch块,并保证调用Dispose()
——它可以用于IDisposable
的所有实现者。我同意,这正是“using”块的用途。谢谢:)我甚至不知道using块。这实际上不起作用。我遇到了同样的“未分配局部变量”问题。我也希望使用此选项,但为了使其工作,您需要将流装入try/catch/finally块之外的板条箱中。@Wagner Silveira-他在块之外创建了它。对不起,我的意思是创建并初始化它。。。流=空;他的原始代码中缺少的行。
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*/
}