.Netの例外

1,315 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

.Netの例外

  1. 1. .NETの例外処理
  2. 2. Myself 森理 麟(@moririring) 職業:ゲームプログラマ HP : moririringのHP Microsoft MVP for C# 2
  3. 3. My Community VSハッカソン倶楽部 ExcptionalC++読書会 社内勉強会勉強会 Unityクリエイターズ Visual Studio勉強会 IT英語勉強会 ぼちぼちぼっち開発←NEW 3
  4. 4. 皆さん例外処理を書いていま すかー? Exceptional 4
  5. 5. 僕は例外処理は殆ど書かずに きた。…という言い訳 5
  6. 6. 最近は.NETでは例外処理を意 識している ただ、正しい書き方の結論が 出ていない 多分間違ったことも言うので ぜひツッコミを! あと今日の趣旨と違いソース はC#。ゴメンナサイ。 6
  7. 7. .NETの例外処理 その前に 7
  8. 8. .NETはデフォルトの例外を表 示するウィンドウが頂けない この情報の殆どは開発者向 け。使用者向けではない。 8
  9. 9. 以下を書くことで例外時のUI と処理を替えられる Application.ThreadException += (s, e) => { //ここで独自のエラー表示や処理をする MessageBox.Show("エラーが発生しました"); Application.Exit(); }; (※コンソールはAppDomain.CurrentDomain.UnhandledException) 9
  10. 10. 僕はメッセージを単純にして 内容メールを送るようにした メール実装をして分かったこ とは誰も連絡なんかくれない 10
  11. 11. メッセージボックスに「何か あったら森理まで」とか書い ても多分無駄 11
  12. 12. メール処理で例外が出てしま うと本末転倒なので注意 さらにDB書き込みをしていた が、例外処理が甘くて。。。 12
  13. 13. .NETの例外処理 13
  14. 14. 例外処理について詳しく解説 されているHPは少ない印象。 ソースがアップされていても 「例外処理は分かりやすくす るために省きます」とか。 14
  15. 15. 例外を意識しだしてから適切 なtry-catchを書こうとした それでもアプリが止まること はあり、指針が定まらない 15
  16. 16. で、最近例外処理について書 かれている良い文章を発見 とあるコンサルタントのつぶ やき「.NETの例外処理 」 http://blogs.msdn.com/b/nakam a/archive/2008/12/29/net-part1.aspx 16
  17. 17. もっとも衝撃的だったのが以下 の一文。大文字フォント+赤文 字で書かれている。 よほどのことがない限 り、アプリケーション で try-catch を書いて はいけません。 17
  18. 18. さらに重要な内容がこれ エンドユーザに対して再試行 を促すようなメッセージを表 示することになるケースを業 務エラーと呼ぶ。業務エラー では、例外を利用してはいけ ない。 18
  19. 19. 「殆どの例外処理は、どうに もならん場合以外お前のプロ グラムでなんとかしろ!」っ てことかなーと。 19
  20. 20. .NETの例外処理の書 き方 20
  21. 21. 以下の1行への適切な例外処理 とは? public string ReadAllText(string filePath) { return File.OpenText(filePath).ReadToEnd(); } 21
  22. 22. 僕がよく行くサイトで書かれ ている例外処理。 http://dobon.net/vb/dotnet/begi nner/exceptionhandling.html 22
  23. 23. 23
  24. 24. まずFile.Existでファイルが存 在しているかチェック フォルダがない時、ファイル がない時など多くの例外は防 げる 24
  25. 25. ファイルが存在する場合の例 外はファイルロックだけ? OpenText(FileStremが読み取 り)はロックされていても開く。 25
  26. 26. 実際にこの書き方で、例外が 起こせないか手動で色々試す  ファイルを消す  フォルダを消す  Excelやサクラエディタで開いておく  アクセス権のないアカウントを作って アクセスする  でかいファイル作って、ロード中に削 除する 26
  27. 27. 結果自力では例外を起こせず 27
  28. 28. ちょっと話を変えて、例外が 来た時のリカバリーの疑問 28
  29. 29. ファイルの例外はMessageBox でエラーを知らせるのが楽 どういうメッセージが適切か 調べる必要がある 29
  30. 30. IOExceptionのようなエラー全 般がくる例外でどのメッセー ジが適切なのか判断つかず。 30
  31. 31. サンプルはかなり適切。それ でも万全かは疑問が残る 31
  32. 32. 色々見ていてふとex.Message こそ正しいメッセージが入っ ていることに気づく。 MSDNによると開発者向け? なので多少助長な時もあるが 32
  33. 33. そうなると結局どの例外がこ ようが以下の書き方がエラー メッセージになるのかな? try { } catch (Exception ex) { MessageBox.Show(ex.Message); } 33
  34. 34. 完全に例外を握りつぶすよう な書き方はするべきではない とよく見る。 34
  35. 35. さまざまなことを考えて、ど う書くべきか、皆さんの考え を教えて下さい 35
  36. 36. if (File.Exists(filePath)) { try { using (var sr = File.OpenText(filePath)) { s = sr.ReadToEnd(); } } //例外は全てメッセージを出すことでエラー処理とする catch (Exception ex) { MessageBox.Show(ex.Message); } } 36
  37. 37. 1.例外はエラーメッセージ を出して全て握りつぶす。 2.ファイル系とアクセス例 外はエラーメッセージを出し ては握りつぶす。 3.サンプル通り全部書く 4.どれとも違う。 37
  38. 38. 実は手動で一つだけ例外をだ せる方法があった。 10GBのファイルを作ってロー ドする。 Exceptionでthrowを書いてし まうとこのアプリは止まる。 ただちょっと作為的すぎ? 38
  39. 39. .NETの別の例外対策 39
  40. 40. そもそも.NETで言えばエラー チェックはUIで制御してしま うべきだと思う 40
  41. 41. OpenFileDialogやSaveFileDialog を使えばFile.Existsより確実に 例外を防ぐ。 ただ、起動時ロードの実装な どでやはり例外が来たりもす る 41
  42. 42. テキストにドラッグする場合 などは、ファイルがない場合 ボタンが押せないとするべき private void textBox_TextChanged(object sender, EventArgs e) { button1.Enabled = File.Exists(textBox.Text); } 42
  43. 43. .NETの例外処理のま とめ 43
  44. 44. ファイルアクセス時の例外処 理で、リソースへのアクセス 時は殆ど同じで行けるかな と。 44
  45. 45. 例外はやっぱり難しい どうするべきかは経験の蓄積 例外の多くはnullチェックでか なり防げる 45
  46. 46. ご清聴ありがとうございまし た Thank you for hearing my talk! 46

×