- - PR -
IOExceptionについて
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-07-30 21:18
いつもお世話になっております。
今回、CSV形式データをファイルに出力するメソッドを作成したのですが、出力先のディスク容量が一杯であったときに、例外エラーが発生するのですが、その後別のフォームを開こうとする時に「'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。」というエラーメッセージが発生して、処理がとまってしまいます。 デバッグ実行時にしか発生せず、exe実行の時は問題なく動作するのですが、このエラーメッセージは表示されていてもとくに問題はないのでしょうか?説明がわかりずらくなってしまったので、以下に、ソースの内容を記します。 ----------------------------------------------------- StreamWriter outputStream = new StreamWriter( "ファイルパス" , true ,System.Text.Encoding.GetEncoding(932)) ; //出力 outputStream.Write( "対象データ" + "," ) ; ・・・・省略 outputStream.Close() ; --------------------------------------------------------------- このClose()メソッドを呼ぶ時にIOExceptionが発生しています。 この例外エラーに関してはtry〜catchでオリジナルメッセージボックスを出すようにしています。 その後で、別のフォームを開こうとした時に -------------------------------------------------- 'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。 [中断] [継続] -------------------------------------------------- のエラーメッセージボックスが出てくるのです。 わかりづらい書き方で申し訳ありません。 よいアドバイスがありましたらよろしくお願いいたします。 | ||||
|
投稿日時: 2003-07-31 08:06
outputStream.Close()時の、キャッシュ書込み時に例外が発生しているのでしょうか?
であれば、outputStream が開放される際に、オープン中の為、再度Close()が呼び出されて、 再度例外が発生しているのでは? 変数の宣言箇所とtry,catchの位置関係、Dispose等で、回避できないでしょうか? (未確認です。) | ||||
|
投稿日時: 2003-07-31 09:37
Closeの処理はDisposeの処理と等価なので、というよりStreamWriterクラスにパブリックなDisposeメソッドがないですね^^; Close中にIOExceptionが発生、ということですが、「閉じることができない」時に発生するので(FileStream.Closeより)、outputStreamがスコープを外れるためにFinalizeが呼ばれ、その中でDisposeが呼ばれて同じ例外が再発生しているのでしょう。 procedure { StreamWriter outputStream; try { outputStream.Close() // 例外発生:実は閉じていない } catch (IOException ioex) { // メッセージ表示 } } // スコープが外れるので、GC対象になる // この後、GCが動作するタイミングで、Finalizeが呼ばれ、 // FinalizeからDisposeが呼ばれて、例外が再発生する 「ディスクがいっぱい」ということなので、最初の例外が発生したときに、出力バッファの内容をクリアしてやる必要があるのでしょう。が、そういうメソッドはないようですね。 StreamWriterではなくFileStreamを使い、ReadWriteで開いて、書き込みがいっぱいになったらSeekでポジションを戻す・・・じゃダメかな? | ||||
1
