質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

2回答

13127閲覧

Windows Formでエラーメッセージを表示するスタンダードな方法

tarot_shogun

総合スコア29

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2019/03/09 15:49

現在、Windows Formを使用したアプリケーションを作成しています。
Exceptionの内容に応じてメッセージボックスを表示させる良い方法をお教えください。

<やりたいこと>
「ファイルが既に開かれている場合にはエラーメッセージを表示する」
という処理を実装しようと考えています。

<問題点>
エラーのcatchをクラス内で呼び出しており、
それをどうやってForm1クラスに渡すべきなのか というところに悩んでいます。

<考えたここと>
・戻り値をstringにしてForm1クラスに渡す(下記コード)
・ExceptionのcatchをInputFileクラス内で行わずにForm1で行う
・InputFileクラスにFormをインクルードして直接メッセージボックスを表示させる

<聞きたいこと>
エラーメッセージを表示させるのはどのように実装するのが良いのでしょうか。
ご存知の方はお教えくださると嬉しいです。

C#

1 public partial class Form1 : Form 2 { 3 // ... 略 ... 4 5 private void button1_Click(object sender, EventArgs e) 6 { 7 string msg = inputFile.ReadFile; 8 if ( msg != "" ) 9 { 10 MessageBox.Show(msg, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); 11 } 12 } 13 } 14 15 class InputFile 16 { 17 // ... 略 ... 18 19 public string ReadFile() 20 { 21 FileInfo fileInfo = new FileInfo(Path); 22 23 try 24 { 25 using (var fs = new FileStream(Path, FileMode.Open)) { } 26 } 27 catch (IOException e) 28 { 29 return e.ToString(); 30 } 31 32 using (var package = new ExcelPackage(fileInfo, password)) 33 { 34 return ""; 35 } 36 } 37 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

そこらへんは個々それぞれのやり方があるでしょうね

私なんかはあらゆるエラーを自前の例外のmessageにエラーメッセージを入れてthrowして、あとの catchでエラーダイアログを出す、というズボラな方法をとってます

投稿2019/03/09 22:54

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarot_shogun

2019/03/10 02:46 編集

やはり、メッセージダイアログそのものはForm1クラスで出力するという認識で正しいでしょうか?
y_waiwai

2019/03/10 13:06

そうですね 例外を出しとけばどこでもだせますが、Formで出すほうがわかりやすいでしょうね
guest

0

ベストアンサー

そういう場合はReadFileでは例外を捕まえずに呼び出し元(Form1)で処理させるほうがいいです。
「例外」はその関数で想定される、行われるべき処理が継続できない事態が発生して関数から予定外の脱出が行われる場合に使用します。
「ReadFile」という関数がその名の通り「ファイルを読む」という役割を担っているなら、正しくファイルを読めた場合の結果が戻り値として返され、それが失敗したら例外で呼び出し元に伝えます。例外の分類(クラスの種類)に問題がなければFileStreamの例外はReadFileでは処理せずForm1(呼び出し元)で捕まえてメッセージを出すなりしてください。
そうすることでcatchにエラー処理を任せて、try{}内は常に想定している(エラーの無い)処理の流れを記述できます。

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 try{ 4 var readResult = inputFile.ReadFile; 5 6 // ここではReadFileが成功した前提で処理を記述できる 7 8 } 9 catch(Exception ex){ 10 MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); 11 } 12} 13 14public string ReadFile() 15{ 16 FileInfo fileInfo = new FileInfo(Path); 17 18 try 19 { 20 using (var fs = new FileStream(Path, FileMode.Open)) { } 21 } 22 catch (IOException e) 23 { 24 // なんか必要な処理 25 // 処理が必要なければ try---catchも不要 26 throw; // 例外を投げ直す 27 } 28 ... 29 rteturn readResult; // 関数の戻り値は正しく読みだせた場合の内容を返す 30}

投稿2019/03/09 17:11

編集2019/03/09 17:14
toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarot_shogun

2019/03/10 02:44

ご回答ありがとうございます。大変勉強になりました。またの機会が御座いましたらよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問