- PR -

IOExceptionについて

1
投稿者投稿内容
クニモニ
常連さん
会議室デビュー日: 2003/06/17
投稿数: 22
投稿日時: 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/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-31 08:06
outputStream.Close()時の、キャッシュ書込み時に例外が発生しているのでしょうか?

であれば、outputStream が開放される際に、オープン中の為、再度Close()が呼び出されて、
再度例外が発生しているのでは?

変数の宣言箇所とtry,catchの位置関係、Dispose等で、回避できないでしょうか?
(未確認です。)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-07-31 09:37
引用:

ななさんの書き込み (2003-07-31 08:06) より:

変数の宣言箇所とtry,catchの位置関係、Dispose等で、回避できないでしょうか?


 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

スキルアップ/キャリアアップ(JOB@IT)