Подскажите пожалуйста, как тут с перехватом исключений разобраться. Как видно из примера, надо обрабатывать исключение IO и сериализации. Проблема в том что я не знаю где разместить myStream.Close(), так как когда возникает ошибка при десериализации, закрытие потока произойти не успевает, а если разместить myStream.Close() где-то в блоках catch или finaly или за ними то компилятор ругается на то что не знает что такое myStream. Одним словом, после ошибки десериализации, файл остаётся занят потоком
try
{
Stream myStream = new FileStream(openFileDialog1.FileName, FileMode.Open);
BinaryFormatter myBinary = new BinaryFormatter();
mControls.SetContainer((Container)myBinary.Deserialize(myStream));
myStream.Close();
}
catch(System.Runtime.Serialization.SerializationException)
{
.......
return;
}
catch(System.IO.IOException)
{
.......
return;
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Здравствуйте, tdebug, Вы писали:
А так пойдет?
T> Stream myStream;
T> try
T> {
T> myStream = new FileStream(openFileDialog1.FileName, FileMode.Open);
T> BinaryFormatter myBinary = new BinaryFormatter();
T> mControls.SetContainer((Container)myBinary.Deserialize(myStream));
T> }
T> catch(System.Runtime.Serialization.SerializationException)
T> {
T> .......
T> return;
T> }
T> catch(System.IO.IOException)
T> {
T> .......
T> return;
T> }
finally
{
myStream.Close();
}
T>
... << RSDN@Home 1.1.4 stable rev. 510>>
Здравствуйте, Hup, Вы писали:
Hup>Здравствуйте, tdebug, Вы писали:
Hup>А так пойдет?
T>>Hup> Stream myStream;
T>> try
T>> {
T>> myStream = new FileStream(openFileDialog1.FileName, FileMode.Open);
T>> BinaryFormatter myBinary = new BinaryFormatter();
T>> mControls.SetContainer((Container)myBinary.Deserialize(myStream));
T>> }
T>> catch(System.Runtime.Serialization.SerializationException)
T>> {
T>> .......
T>> return;
T>> }
T>> catch(System.IO.IOException)
T>> {
T>> .......
T>> return;
T>> }
Hup> finally
Hup> {
if(myStream != null)
Hup> myStream.Close();
Hup> }
T>>
Здравствуйте, tdebug, Вы писали:
T>Проблема в том что я не знаю где разместить myStream.Close()
используй using
... << RSDN@Home 1.1.4 beta 7 rev. 501>>
Здравствуйте, tdebug, Вы писали:
T>Подскажите пожалуйста, как тут с перехватом исключений разобраться. Как видно из примера, надо обрабатывать исключение IO и сериализации. Проблема в том что я не знаю где разместить myStream.Close(), так как когда возникает ошибка при десериализации, закрытие потока произойти не успевает, а если разместить myStream.Close() где-то в блоках catch или finaly или за ними то компилятор ругается на то что не знает что такое myStream. Одним словом, после ошибки десериализации, файл остаётся занят потоком
try {
using(Stream myStream = new FileStream(openFileDialog1.FileName, FileMode.Open)) {
BinaryFormatter myBinary = new BinaryFormatter();
mControls.SetContainer((Container)myBinary.Deserialize(myStream));
}//using
} catch(SerializationException) {
return;
} catch(IOException) {
return;
}//try
<< RSDN@Home 1.1.4 beta 7 rev. 500 >> =11:15= [Windows XP — 5.1.2600.0]
under «*none*»
Здравствуйте, tdebug, Вы писали:
Привьнее всего будет вот так:
try
{
Stream myStream = new FileStream(openFileDialog1.FileName, FileMode.Open);
try
{
BinaryFormatter myBinary = new BinaryFormatter();
mControls.SetContainer((Container)myBinary.Deserialize(myStream));
}
finally
{
myStream.Close();
}
}
catch(System.Runtime.Serialization.SerializationException)
{
.......
return;
}
catch(System.IO.IOException)
{
.......
return;
}
или (так намного элегантнее):
try
{
using (Stream myStream = new FileStream(openFileDialog1.FileName, FileMode.Open))
{
BinaryFormatter myBinary = new BinaryFormatter();
mControls.SetContainer((Container)myBinary.Deserialize(myStream));
}
}
catch(System.Runtime.Serialization.SerializationException)
{
.......
return;
}
catch(System.IO.IOException)
{
.......
return;
}
... << RSDN@Home 1.1.4 stable rev. 510>>