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

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

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

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

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

Q&A

解決済

2回答

2108閲覧

readlineとdrawstringの所で例外を意図的に発生させたい

hinatti

総合スコア14

C#

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

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

0グッド

0クリップ

投稿2017/09/15 06:35

編集2017/09/15 07:10

###前提・実現したいこと
作成したプログラムの単体テストをしているのですがreadLineとdrawstringの所で意図的に例外を発生させたい

###該当のソースコード

C#

1/// <summary> 2 /// FormProductDisplayのイベントハンドラ 3 /// DBに接続して任意のファイルをINSERTする 4 /// </summary> 5 /// <param name="sender">使用しない</param> 6 /// <param name="e">使用しない</param> 7 private void FormProductDisplay_Load(object sender, EventArgs e) 8 { 9 string sqlDelete = @"DELETE FROM product_table"; 10 11 using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectionString)) 12 using (SqlCommand command = new SqlCommand(sqlDelete, connection)) 13 { 14 try 15 { 16 connection.Open(); 17 } 18 catch (Exception ex) 19 { 20 MessageBox.Show("データベースを開くのに失敗しました。", "error", MessageBoxButtons.OK, MessageBoxIcon.Error); 21 System.Diagnostics.Debug.WriteLine(ex.ToString()); 22 return; 23 } 24 25 try 26 { 27 command.ExecuteNonQuery(); 28 } 29 catch (Exception ex) 30 { 31 MessageBox.Show("SQL文を実行出来ませんでした。", "error", MessageBoxButtons.OK, MessageBoxIcon.Error); 32 System.Diagnostics.Debug.WriteLine(ex.ToString()); 33 return; 34 } 35 } 36 37 string filePath; 38 using (OpenFileDialog dialog = new OpenFileDialog()) 39 { 40 dialog.FileName = "default.txt"; 41 dialog.InitialDirectory = ""; 42 dialog.Title = "開くファイルを選択してください。"; 43 dialog.RestoreDirectory = true; 44 dialog.CheckFileExists = false; 45 TopMost = false; 46 47 if (dialog.ShowDialog() == DialogResult.Cancel) 48 { 49 return; 50 } 51 52 filePath = dialog.FileName; 53 } 54 55 using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectionString)) 56 { 57 string sqlInsert = @" 58INSERT INTO product_table ( 59product_id, 60basic_order_lot, 61product_code, 62chassis_number, 63assembled_ymd, 64assembled_hms, 65struct_number, 66yyyymm 67) 68VALUES ( 69@product_id, 70@basic_order_lot, 71@product_code, 72@chassis_number, 73@assembled_ymd, 74@assembled_hms, 75@struct_number, 76@yyyymm 77); 78"; 79 try 80 { 81 connection.Open(); 82 } 83 catch (Exception ex) 84 { 85 MessageBox.Show("データベースを開くのに失敗しました。", "error", MessageBoxButtons.OK, MessageBoxIcon.Error); 86 System.Diagnostics.Debug.WriteLine(ex.ToString()); 87 return; 88 } 89 90 using (SqlCommand command = new SqlCommand(sqlInsert, connection)) 91 { 92 FileStream stream; 93 94 try 95 { 96 stream = File.Open(filePath, FileMode.Open); 97 } 98 catch (Exception ex) 99 { 100 MessageBox.Show("ファイルを開くのに失敗しました。", "error", MessageBoxButtons.OK, MessageBoxIcon.Error); 101 System.Diagnostics.Debug.WriteLine(ex.ToString()); 102 return; 103 } 104 105 using (StreamReader read = new StreamReader(stream)) 106 { 107 while (read.EndOfStream == false) 108 { 109 string line; 110 try 111 { 112 line = read.ReadLine(); 113 } 114 catch (Exception ex) 115 { 116 MessageBox.Show("ファイルの読み込みに失敗しました。", "error", MessageBoxButtons.OK, MessageBoxIcon.Error); 117 System.Diagnostics.Debug.WriteLine(ex.ToString()); 118 return; 119 } 120 121 if (line == null) 122 { 123 break; 124 } 125 126 command.Parameters.AddWithValue("@product_id", line.Substring(0, 11)); 127 command.Parameters.AddWithValue("@basic_order_lot", line.Substring(11, 8)); 128 command.Parameters.AddWithValue("@product_code", line.Substring(19, 6)); 129 command.Parameters.AddWithValue("@chassis_number", line.Substring(25, 4)); 130 command.Parameters.AddWithValue("@assembled_ymd", line.Substring(29, 8)); 131 command.Parameters.AddWithValue("@assembled_hms", line.Substring(37, 11)); 132 command.Parameters.AddWithValue("@struct_number", line.Substring(48, 7)); 133 command.Parameters.AddWithValue("@yyyymm", line.Substring(55, 6)); 134 135 try 136 { 137 command.ExecuteNonQuery(); 138 } 139 catch (Exception ex) 140 { 141 MessageBox.Show("データの追加に失敗しました。", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); 142 System.Diagnostics.Debug.WriteLine(ex.ToString()); 143 } 144 command.Parameters.Clear(); 145 } 146 read.Close(); 147 } 148 } 149 } 150 } 151 . 152 . 153 . 154 /// <summary> 155 /// 1ページ印刷するイベントハンドラ 156 /// 1ページ分の印刷設定 157 /// </summary> 158 /// <param name="sender">使用しない</param> 159 /// <param name="e">使用する</param> 160 private void PrintPage(object sender, PrintPageEventArgs e) 161 { 162 int x, y = 20; 163 e.HasMorePages = true; 164 Font font = new Font("MS ゴシック", 12); 165 var productList = productDataBindingSource.DataSource as List<ProductData>; 166 167 if (productList == null) 168 { 169 e.HasMorePages = false; 170 return; 171 } 172 173 for (int i = ((page - 1) * 50); 174 (i < productList.Count && (i < (page * 50))); 175 i++) 176 { 177 ProductData data = productList[i]; 178 try 179 { 180 if (data == null) 181 { 182 return; 183 } 184 185 x = 30; 186 e.Graphics.DrawString(data.ProductId, font, Brushes.Black, x, y); 187 x = x + 80; 188 e.Graphics.DrawString(data.BasicOrderLot, font, Brushes.Black, x, y); 189 x = x + 90; 190 e.Graphics.DrawString(data.ProductCode, font, Brushes.Black, x, y); 191 x = x + 80; 192 e.Graphics.DrawString(data.ChassisNumber, font, Brushes.Black, x, y); 193 x = x + 60; 194 e.Graphics.DrawString(data.AssembledYmd, font, Brushes.Black, x, y); 195 x = x + 150; 196 e.Graphics.DrawString(data.AssembledHms, font, Brushes.Black, x, y); 197 x = x + 100; 198 e.Graphics.DrawString(data.StructNumber, font, Brushes.Black, x, y); 199 x = x + 100; 200 e.Graphics.DrawString(data.YyyyMm, font, Brushes.Black, x, y); 201 y = y + 20; 202 } 203 catch (Exception ex) 204 { 205 MessageBox.Show("描画出来ませんでした。", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); 206 System.Diagnostics.Debug.WriteLine(ex.ToString()); 207 e.HasMorePages = false; 208 } 209 } 210 211 e.Graphics.DrawString(String.Format("{0}ページ", page), font, Brushes.Black, 365, 1110); 212 page++; 213 214 if (productList.Count <= (page - 1) * 50) 215 { 216 e.HasMorePages = false; 217 page = 1; 218 return; 219 } 220 }

###試したこと
開いたファイルを消したら読み込みができないんじゃないかと思い実践しようと思ったのですが他のプログラムで開いていたら消去が出来なかったです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

throw new Exception(); というコードを例外を発生させたい行に入れれば「例外を意図的に発生」はできると思うのですが、そういうことではない?

【追記】

コメント欄に、

例外処置の基本として「業務エラー」と「例外」分けて処理するというのがあります。今回の話は「業務エラー」として処置する話ではないかと思います。詳しくはコメント欄に書ききれませんので、回答欄に追記しておきます。

と書きましたが、それを以下に書いておきます。

例外処置について、自分的に一般的に行うべきなのは以下の通りと思っています:

(1) 予測可能で正しい業務フローに戻すことができる「業務エラー」(例:ユーザーの入力間違い)と、予測できないもしくは予測はできても何の対応もできない「例外」(例:DB サーバーダウン)を区別して対処。

(2) 「例外」はランタイムに拾わせてアプリケーションを停止させる。

(3) よほどのことがない限り try-catch は書かない。

(4) キャッチせざるを得ない場合でも Excption はキャッチしない。

(5) 間違って補足してしまった例外は throw する。(注:catch ブロックでキャッチした例外を throw するとスタックトレースが途切れるので単に throw と書く)

(6) ユーザーへの通知が必要なら、集約的例外処置を利用する。

詳しくは以下の記事を見てください。

NETの例外処理 Part.1
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

あと、.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それでも Catch (Exception e) を使用するのはよくない」ということについては以下の記事を見てください。

破損状態例外を処理する
https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx

投稿2017/09/15 07:00

編集2017/09/15 07:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hinatti

2017/09/15 07:01

ですね… ソースコードをいじらずに例外を発生させたいんです
退会済みユーザー

退会済みユーザー

2017/09/15 07:04

目的は何ですか? 何をしたいのですか? 全体的なシナリオ・やりたいことを書いていただけると理解しやすいのですが・・・
hinatti

2017/09/15 07:07

完成したプログラムの単体テストをしたいのです テスト項目にファイルが読み込めなかった場合と描画出来なかった場合の項目があるので意図的に例外を発生させたいのです
退会済みユーザー

退会済みユーザー

2017/09/15 07:33

実際に「ファイルが読み込めなかった場合」と「描画出来なかった場合」という状況を作ってテストするしかないと思います。 ただし、そういう状況を作ってテストしたとしても、果たして ReadLine や DrawString が質問者さんが期待するように例外をスローするかどうかは別の話です。 まずは、質問者さんが「ファイルが読み込めなかった場合」と「描画出来なかった場合」というのが具体的にどういう状況なのかをきちんと明確にして定義し、それを検出するための仕組みを考えるべきと思います。 その仕組みを実現する上では ReadLine や DrawString がスローする例外に頼る必要はないかもしれません。(そもそも例外を発生させるというやり方は問題ありだと思います) 例えば、「ファイルが読み込めなかった場合」というのは、ReadLine メソッドを実行する前にチェックできるのではないですか?
hinatti

2017/09/15 07:44

本当は試験項目が合っているかどうか上司がチェックしてくれるのですが今回に限ってチェックしてくれなくて試験項目書が合っているのかどうかも分からないまま単体テストを行っているような状況でして… ファイルが開けなかったらそもそもファイルが読み込めなくないか?とは疑問に思ってました…
退会済みユーザー

退会済みユーザー

2017/09/15 07:52

例外処置の基本として「業務エラー」と「例外」分けて処理するというのがあります。今回の話は「業務エラー」として処置する話ではないかと思います。詳しくはコメント欄に書ききれませんので、回答欄に追記しておきます。
hinatti

2017/09/15 08:05

わざわざありがとうございます…! try-catchってあんまり書かない方がいいんですね…初めて知りました… まだ業務には入っていないんですけど業務に入ったらSurferさんの話を参考にしてテストしていきたいと思います。 今回の2つの場合はこの話で行くと例外の方になるんですかね? プリンター側の問題かファイル側の問題だからテストで再現するのは難しいってことですかね?
退会済みユーザー

退会済みユーザー

2017/09/15 08:16

> 今回の2つの場合はこの話で行くと例外の方になるんですかね? そのあたりは質問者さんの状況・事情によるので当方は何とも言えませんが、例えば(あくまで例えばです)「ファイルが読み込めなかった場合」というのが、 (1) ユーザーのファイル名等の選択ミスでユーザーが選択をやり直せば正しい業務フローに戻せるなら「業務エラー」として対応し、ユーザーに選択の変更を促す、 (2) ファイルサーバーの障害等でユーザーが何とも対処できないような場合は「例外」としてランタイムに拾わせてアプリケーションを停止させる ・・・ということになると思います。
hinatti

2017/09/15 08:28

なるほど… 今回の状況だとreadlineは業務エラーでdrawstringは例外っぽいです ご丁寧にありがとうございました。BAにさせていただきます。
guest

0

どちらもコードをいじらずに例外を発生するのは難しいと思います。

まず、発生しうる例外を確認します。
StreamReader.ReadLine メソッド → 例外セクション
I/Oエラーとメモリ不足で例外を発生できるようです。

Graphics.DrawString メソッド (String, Font, Brush, Single, Single) → 例外セクション
描画文字列またはBrushがnullの場合発生するようです。

次に、この例外を発生できる方法を想像します。
ReadLine の場合、ネットワーク上のファイルを対象とし、読み込み途中でネットワークを切ったりしてみてはどうでしょうか?
DrawString の場合、思いつきません...

投稿2017/09/15 07:18

koguma98

総合スコア288

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

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

hinatti

2017/09/15 07:26

ネットワーク上のファイルというと例えばデスクトップ上に保存しているフォルダの中のファイルとかでしょうか? 自分もMSDNで例外条件を調べてDrawStringの例外の発生のさせ方が思いつかなくて…w
koguma98

2017/09/15 07:34

共有フォルダ上のファイルです。 ネットワークを切った時に参照できなくなるファイルですね。 それでも、キャッシュの影響があるでしょうから、ある程度大きなサイズのファイルである必要もあるかもしれません。
hinatti

2017/09/15 07:45

ふむふむ…なるほど 教えていただきありがとうございます、参考にさせてもらいます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問