C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ファイル操作のエラー処理などはこんなんでどうでしょう


(過去ログ 5 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■5841 / inTopicNo.1)  ファイル操作のエラー処理などはこんなんでどうでしょう
  
□投稿者/ iwaiwa 二等兵(7回)-(2006/08/23(Wed) 01:39:10)

分類:[C#] 


分類:[C#] 

中@管理人
タイトルが意味がわかりませんでしたので変更しました。
================================
こんにちは。

ファイル保存に関するプログラムを書いていて気になったことがあります。
以下のような書き方をしていたとして、何か問題があるとすれば、
どんな点ですか?エラー処理の観点などから、ご指摘頂ければと思っています。

非常に曖昧な質問で恐縮ですが、ご指摘ください。
よろしくお願い致します。

---------------------------

private void SaveFile(string fileName, RichTextBox richTextBox, ToolStripStatusLabel statusLabel)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();

saveFileDialog.Filter = "テキストファイル (*.txt)|*.txt|"
+ "Word 文書 (*.doc)|*.doc|"
+ "リッチ テキスト形式 (*.rtf)|*.rtf";

// デフォルトファイル名
saveFileDialog.FileName = fileName;

// ダイアログを開く
DialogResult result = saveFileDialog.ShowDialog();

if (result == DialogResult.OK)
{
StreamWriter writer = new StreamWriter(saveFileDialog.FileName, false, Encoding.GetEncoding("Shift_JIS"));

try
{
statusLabel.Text = "ファイルを保存しています...";

if (saveFileDialog.FilterIndex > 1)
{
// リッチテキスト
writer.Write(richTextBox.Rtf);
}
else
{
// テキスト形式
writer.Write(richTextBox.Text);
}
}
catch (Exception ex)
{
// エラーメッセージを表示
MessageBox.Show(ex.Message,
"エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
finally
{
writer.Close();
statusLabel.Text = String.Empty;
}
}
}


0
引用返信 編集キー/
■5851 / inTopicNo.2)  Re[1]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ 中博俊 神(669回)-(2006/08/23(Wed) 07:31:02)
中博俊 さんの Web サイト

分類:[C#] 

IOException以外を拾う意味はないでしょう?

0
引用返信 編集キー/
■5854 / inTopicNo.3)  Re[2]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ あきひろ 二等兵(6回)-(2006/08/23(Wed) 09:02:23)

分類:[C#] 

ファイル開くところで出るかもしれない例外を捕捉していないのは、意図どおりなのかな?


0
引用返信 編集キー/
■5867 / inTopicNo.4)  Re[3]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ はいこーん 准尉(103回)-(2006/08/23(Wed) 11:11:47)

分類:[C#] 

握りつぶしちゃって本当にいいのかな。

0
引用返信 編集キー/
■5889 / inTopicNo.5)  Re[2]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ iwaiwa 二等兵(8回)-(2006/08/23(Wed) 22:43:30)

分類:[C#] 

No5851に返信(中博俊さんの記事)
> IOException以外を拾う意味はないでしょう?

返信ありがとうございました。
こういう場合は、IOException に限定して良いものなのでしょうか?

限定するメリットは何ですか?
お手数ですが、よろしくお願いします。

0
引用返信 編集キー/
■5890 / inTopicNo.6)  Re[4]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ iwaiwa 二等兵(9回)-(2006/08/23(Wed) 22:45:57)

分類:[C#] 

No5867に返信(はいこーんさんの記事)
> 握りつぶしちゃって本当にいいのかな。

返信ありがとうございました。
失礼ですが、おっしゃっていることの意図がよく理解できません。

どこか良くない箇所があれば、ご指摘願いたかったのですが…。

よろしくお願いします。

0
引用返信 編集キー/
■5896 / inTopicNo.7)  Re[5]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ アクア 二等兵(17回)-(2006/08/24(Thu) 01:32:40)

分類:[C#] 

横から失礼します。アクアと申します。

私はC#は未だ門外漢ですが、それでも少しはお手伝いできそうなので…

中博俊さんの
>IOException以外を拾う意味はないでしょう?

は、IOExceptionをご確認くださいと言う事でしょう。
今回のご質問の内容がファイルの保存に関するものなので、予想される例外は
ほぼ、ファイルの読み取りまたは書き込みに失敗した場合など、I/O エラーが発生する場合に限定できますよね。
であるならば、IOExceptionの派生クラスに応じた処理を実装したらどうでしょう?というのが真意と思われます。

>限定するメリットは何ですか?
というより限定しないメリットにはどのようなものが有るのでしょう?
もし限定したIOException以外の例外の発生が想定されるのであれば、IOExceptionの処理を施した上でCatchされたらよいのではないでしょうか?

同様にはいこーんさんの
> 握りつぶしちゃって本当にいいのかな。
というのが、結局コードの上では例外発生ののメッセージを表示しただけで、保存の処理は中途半端に終わらせてますが、それで良いの?
保存できてないんだよ!

と言う事になります。
それらを踏まえると、私であれば、IOExpectionを先ずは確認します。
IOExpectionは基本クラスですので、その基本クラスに応じた派生クラスがあるはずです。
その派生クラスに応じた処理をプログラムでフォローできればきっと使いやすいプログラムになりそうですよ…
というのがお二方のご意見であると思います。

(意図をくみ取り間違えていたらごめんなさい。>お二方。)

同時にIOExceptionを調べると、あきひろさんのアドバイスも生かせるかと思います。

0
引用返信 編集キー/
■5917 / inTopicNo.8)  Re[6]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ iwaiwa 二等兵(11回)-(2006/08/24(Thu) 07:27:49)

分類:[C#] 

ご返信ありがとうございました。

色々とご指摘頂いた点を自分なりに調べたりしたのですが、
まだよく分からない点があるので、引き続き質問させてください。

エラー処理をIOExceptionにほぼ限定して良い、というのは分かりますが、
例えばここでエラーが発生したとして、その処理として考えられるのは、
どのようなものがありますか?

このプログラムはrichTextBoxに入力された情報を、単にファイルに出力
するというものですが、そこでエラーが発生した場合、どのような
処理が必要になってくるのでしょうか?ちょっと、自分では思いつきません。

お手数ですが、ご回答よろしくお願いします。

0
引用返信 編集キー/
■5925 / inTopicNo.9)  Re[6]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ も 一等兵(27回)-(2006/08/24(Thu) 08:52:05)

分類:[C#] 

No5896に返信(アクアさんの記事)
IOExceptionの件は激しく同意します
現状のコードだと想定している動作(=ファイルに関する例外)以上のことも出来てしまうので、
かなり危険な香りがします

> 同様にはいこーんさんの
>>握りつぶしちゃって本当にいいのかな。
> というのが、結局コードの上では例外発生ののメッセージを表示しただけで、保存の処理は中途半端に終わらせてますが、それで良いの?
> 保存できてないんだよ!
[StreamWriter].write()ってall or nothingで、
保存するという処理はatomicなんじゃないのかな?
(それともやっぱり中途半端に書かれるのかな…もしそうなら例外キャッチの所で存在しているファイルを消さないとならないか)

0
引用返信 編集キー/
■6019 / inTopicNo.10)  Re[7]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ アクア 二等兵(18回)-(2006/08/26(Sat) 10:48:17)

分類:[C#] 

もさん
ご指摘ありがとうございます。

>(それともやっぱり中途半端に書かれるのかな…もしそうなら例外キャッチの所で存在しているファイルを消さないとならないか)

実はここ、私の知識も中途半端です。(^^;
ただ、通常ならかならず、Finallyの所でファイルを閉じたりオブジェクトを開放したりするコードを記述するので、
内容は保持されているのだろうと思っていました。
(調べては見たのですが、少し手がかりが少ないので…苦労しそうです。)

iwaiwaさん
>そこでエラーが発生した場合、どのような処理が必要になってくるのでしょうか?
ご自分でどのような場合に例外が発生するのか想像してみてください。
エラーが発生した場合ではなく、エラーが発生する原因はなにか?です。
その上で想定できる所は、コードで記述し、想定外の場合を例外処理で検出する事が重要だと思います。

0
引用返信 編集キー/
■6021 / inTopicNo.11)  Re[7]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ 渋木宏明(ひどり) 二等兵(5回)-(2006/08/26(Sat) 10:56:46)
渋木宏明(ひどり) さんの Web サイト

分類:[C#] 

> このプログラムはrichTextBoxに入力された情報を、単にファイルに出力
> するというものですが、そこでエラーが発生した場合、どのような
> 処理が必要になってくるのでしょうか?

それはアプリケーションの「仕様」として、自分で検討するべき事項です。

ある程度一般論的な措置もあるとは思いますが、最終的にどんな措置をすれば適切であるかは、その処理やアプリケーションに何が求められているかで異なってきます。

>ちょっと、自分では思いつきません。

では、例えば「何事も無かったかのように振舞う」が適切な措置だと思えるでしょうか?

例えば「メッセージを表示してユーザに違うパスへの保存を促す」などの方向性もあると思います。


0
引用返信 編集キー/
■6060 / inTopicNo.12)  Re[8]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ iwaiwa 二等兵(12回)-(2006/08/27(Sun) 09:51:42)

分類:[C#] 

ご回答ありがとうございました。

皆さんに色々と教えて頂いて恐縮なのですが、未だ自分的にはすっきりしません。

> では、例えば「何事も無かったかのように振舞う」が適切な措置だと思えるでしょうか?
>
> 例えば「メッセージを表示してユーザに違うパスへの保存を促す」などの方向性もあると思います。

というご指摘なのですが、例えば、ファイルを保存できなかった場合には、
上のプログラムでエラーメッセージにその旨が表示されると思います。

それで十分と言えば十分ではないのですか?
他の場所に保存を試みるとか、そういう話なら分かるのですが…。

その時に保存できなかった場合は、エラーを表示して保存しない、
これでいいのでは?と思うのですが、どうでしょうか?

0
引用返信 編集キー/
■6061 / inTopicNo.13)  Re[9]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ も 一等兵(30回)-(2006/08/27(Sun) 10:04:38)

分類:[C#] 

No6060に返信(iwaiwaさんの記事)
> ご回答ありがとうございました。
>
> 皆さんに色々と教えて頂いて恐縮なのですが、未だ自分的にはすっきりしません。
>
>>では、例えば「何事も無かったかのように振舞う」が適切な措置だと思えるでしょうか?
>>
>>例えば「メッセージを表示してユーザに違うパスへの保存を促す」などの方向性もあると思います。
>
> というご指摘なのですが、例えば、ファイルを保存できなかった場合には、
> 上のプログラムでエラーメッセージにその旨が表示されると思います。
>
> それで十分と言えば十分ではないのですか?
> 他の場所に保存を試みるとか、そういう話なら分かるのですが…。
>
> その時に保存できなかった場合は、エラーを表示して保存しない、
> これでいいのでは?と思うのですが、どうでしょうか?
私がもしこのSaveFile()という関数(メソッドではないかとおもふ)を作るとなると、
「保存できて当たり前、書き込めないのはおかしい」くらいの勢いで作ります。
もし保存できないなどという例外が発生したならば、
それを処理してしまうのではなくそのまま上に投げる格好にすると思います。
なぜなら、SaveFile()には「保存することだけ」をしてほしいのに、
「保存できない場合」まで勝手に責任を負いそれを回避してしまうことは、
越権行為だと思うからです。

・・・日本語がまとまらない

0
引用返信 編集キー/
■6062 / inTopicNo.14)  Re[9]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ επιστημη 曹長(83回)-(2006/08/27(Sun) 10:45:37)
επιστημη さんの Web サイト

分類:[C#] 

No6060に返信(iwaiwaさんの記事)
>...
>>例えば「メッセージを表示してユーザに違うパスへの保存を促す」などの方向性もあると思います。
>
> というご指摘なのですが、例えば、ファイルを保存できなかった場合には、
> 上のプログラムでエラーメッセージにその旨が表示されると思います。
>
> それで十分と言えば十分ではないのですか?
> 他の場所に保存を試みるとか、そういう話なら分かるのですが…。
>
> その時に保存できなかった場合は、エラーを表示して保存しない、
> これでいいのでは?と思うのですが、どうでしょうか?

それでいい。要は「メソッド SaveFile に何をして欲しいか」という"決め事"ですから。
ただ、失敗したとき単にエラーを表示してオシマイとすると、
これを呼んだ側ではなんの対処もできません。エラーを目にした利用者にすべての対処をゆだねることになります。それが仕様ならそれも善し。

# 僕ならせめて処理の成否を現す bool を返しますね。


0
引用返信 編集キー/
■6064 / inTopicNo.15)  Re[3]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ 中博俊 神(686回)-(2006/08/27(Sun) 10:52:55)
中博俊 さんの Web サイト

分類:[C#] 

>それを処理してしまうのではなくそのまま上に投げる格好にすると思います。
何もしないのが望ましいでしょうね。


0
引用返信 編集キー/
■6066 / inTopicNo.16)  Re[9]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ 渋木宏明(ひどり) 二等兵(6回)-(2006/08/27(Sun) 12:51:44)
渋木宏明(ひどり) さんの Web サイト

分類:[C#] 

> それで十分と言えば十分ではないのですか?

それで十分なこともあれば、そうでないこともあると思います。

> 他の場所に保存を試みるとか、そういう話なら分かるのですが…。

が必要な場合もあるでしょう。

なので、「アプリケーションの仕様」として個別に検討するべきなのです。

> その時に保存できなかった場合は、エラーを表示して保存しない、
> これでいいのでは?と思うのですが、どうでしょうか?

既にコメントがついていますが、ファイル保存のメソッド内でエラーメッセージの表示を行うのは避けた方がよいです。
(簡単なツールならやってしまいますが>自分)

理由も既に出ている通りで、「エラーが発生したら必ずダイアログを表示してしまう」という動作が逆にそのメソッドの再利用性を下げるためです。


0
引用返信 編集キー/
■6072 / inTopicNo.17)  Re[4]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ アクア 二等兵(19回)-(2006/08/27(Sun) 20:48:09)

分類:[C#] 

かき回した アクアですm(__)m

>iwaiwaさん
そういう仕様ですか…

で、あるならば、なにが聞きたかったのでしょう?

私の思慮不足でした。>_<

0
引用返信 編集キー/
■6076 / inTopicNo.18)  Re[5]: ファイル操作のエラー処理などはこんなんでどうでしょう
□投稿者/ あきひろ 二等兵(8回)-(2006/08/28(Mon) 08:58:17)

分類:[C#] 

>iwaiwaさん
>というご指摘なのですが、例えば、ファイルを保存できなかった場合には、
>上のプログラムでエラーメッセージにその旨が表示されると思います。

 いやいやだから、StreamWriterのコンストラクタの所で漏れてますがな。
書き込み権限の無いところに保存しようとしたらどうなるか実際に試してみてくださいまし。

0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -