0

ファイルを開くために Try/Catch を使用すると、プログラムは、存在しないファイルを開こうとすると、Catch パーツ内にあるメッセージではなく、組み込みのメッセージを表示します。何が間違っていて、何を見逃したのですか?

 public void ReadFromFile(MainFrame obj, string filePath)
    {
        try
        {
            filestream = new FileStream(filePath, FileMode.Open);
            BinaryFormatter b = new BinaryFormatter();
            var animals2 = (List<Animal>)b.Deserialize(filestream);

            foreach (Animal animal in animals2)
            {
                AddAnimalToList(animal);
                obj.UppdateListOfRegistredAnimals(animal.ID, animal.Name, animal.Age, animal.Gender);

            }
            obj.UpdateId(animals.Count());
        }
        catch
        {
            MessageBox.Show("Test", "Test", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        finally
        {
            filestream.Close();
        }
    }

編集:組み込みメッセージの理由が上記のコードの前のどこかにあることを発見しました! openFileDialog からのイベントを処理する以下のコードに何か問題があるに違いありません。いくつかのメッセージボックスにもかかわらず、何も表示されないからです! 私は何を間違えたの!? ヘルプは貴重です!

private void menuFileOpen_Click(object sender, EventArgs e)
    {
        DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
        string file = openFileDialog1.FileName;

        if (result == DialogResult.OK)
        {
            MessageBox.Show("TEST", "Test", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            try
            {
                MessageBox.Show("TEST", "Test", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                motelManager.ReadFromFile(this, file); // Smart lösning!!

            }
            catch (FileNotFoundException)
            {
                MessageBox.Show("Error message", "Test", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
    }

ファイルが見つからないというメッセージ

4

2 に答える 2

1

null でないかどうかを確認せずfilestreamにブロックを閉じようとしたことが原因である可能性があります。finallyもしも

filestream = new FileStream(filePath, FileMode.Open);

失敗し、

finally
{
    filestream.Close();
}

ファイルストリームがnullで実行されます。

に変更してみてください

finally
{
    if (filestream != null) filestream.Close();
}

filestreamまたはさらに良いことに、usingブロックでラップします。

using (filestream = new FileStream(filePath, FileMode.Open))
{
    // Do stuff with your filestream
} // filestream.Dispose() automatically called, which in turn calls .Close()
于 2012-07-27T06:13:42.553 に答える
1

これを試して

if(!File.Exists(filePath))
   MessageBox.Show("Not found", "Test", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

詳細については http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspx

private void menuFileOpen_Click(object sender, EventArgs e)
    {
        openFileDialog1.CheckFileExists = false;
        openFileDialog1.CheckPathExists = false;

        DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.


        if (result == DialogResult.OK)
        {
            string file = openFileDialog1.FileName;


            MessageBox.Show("TEST", "Test", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            try
            {
                MessageBox.Show("TEST", "Test", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                motelManager.ReadFromFile(this, file); // Smart lösning!!

            }
            catch (FileNotFoundException)
            {
                MessageBox.Show("Error message", "Test", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
    }

ファイルが見つからないというデフォルトのメッセージが必要ない場合は、使用します

        openFileDialog1.CheckFileExists = false;
        openFileDialog1.CheckPathExists = false;
于 2012-07-27T06:14:28.227 に答える