- ベストアンサー
本やネットの情報は、なぜ例外処理は省かれて書かれているのですか?
本やネットの情報は、なぜ例外処理は省かれて書かれているのですか? 例外処理って企業秘密ですか? それとも、書いている人は例外処理に自信がないのですか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
例えばの話をします。 ---------------------------------------------------------------------------------------------------------- Public Class Form1 Private Sub btnTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnTest.Click Dim strEdit As String strEdit = Test1("A") '←(1) MessageBox.Show(strEdit, "Test", MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub Private Function Test1(ByVal strIndex As String) As String Dim strRet As String Try strRet = String.Empty Select Case strIndex Case 0 strRet = 1 + strIndex Case 1 strRet = 3 + strIndex Case Else '←(2) strRet = 5 + strIndex End Select Return strRet Catch ex As Exception '←(3) Throw '←(4) End Try End Function End Class ■この処理を実行した場合 (1).btnTest の Click イベントで呼んでいる Test1 メソッドの引数が "A" です。 (2).Test1 内の Select Case 文の Case Else で 5 + strIndex をやっています。 しかし、 strIndex には"A"が入ってくるので 5 + strIndex が成り立たずエラーになります。 (3).Try-Catchをしているので例外が発生した場合ここに飛びます。 (4).Throwしているのでメソッドの呼び元(今回の場合はbtnTest)へ例外を返します。 ☆ここがポイント☆ btnTest の Click イベントでは Try-Catch していません。 つまり、 Test1 で例外が発生しても何もしないということです。 どのようになるかというと、 Microsoft が提供している致命的エラーのダイアログが出ます。 見た目が良くないです。 ※画像参照 ---------------------------------------------------------------------------------------------------------- btnTest の Click イベントに Try-Catch を入れてみます。 ■例えばこんな感じ Private Sub btnTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnTest.Click Dim strEdit As String Try strEdit = Test1("A") MessageBox.Show(strEdit, "Test", MessageBoxButtons.OK, MessageBoxIcon.Information) '←※(1) Catch ex As Exception '←(5) '使いまわしはあまりよくないがTestなので・・・ strEdit = String.Empty strEdit = "処理が異常終了した為、強制終了します。" strEdit += vbNewLine strEdit += vbNewLine strEdit += "エラー内容: " strEdit += ex.Message MessageBox.Show(strEdit, "System Error", MessageBoxButtons.OK, MessageBoxIcon.Error) '←(6) End '←(7) End Try '←※(2) End Sub (5). Test1 メソッドで発生した例外を Catch します。 (6).エラー内容を表示します。 (7).システムを落とします。 ※(1)のメッセージ表示は※(2)の位置にあってもかまわない。 ---------------------------------------------------------------------------------------------------------- ■システム的に例外が発生したことを認識したいが異常終了とせず処理を続行する場合 Private Sub btnTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnTest.Click Dim strEdit As String Try strEdit = Test1("A") Catch strEdit = "計算エラーが発生しています。" '←(8) End Try MessageBox.Show(strEdit, "Test", MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub (8). Test1 メソッドで例外が発生しているが処理を続行したいのでメッセージを変更する。 ---------------------------------------------------------------------------------------------------------- なんか参考資料みたくなってしまいましたが、例外は時と場合によって変化するということを書きたかったです。 長文になってしまいましたが、わかるでしょうか?
その他の回答 (5)
- camputer
- ベストアンサー率64% (22/34)
こんばんは,No.3です. >.NET Frameworkの本に載ってないのはなぜ??? おそらくNo.1,No.2両氏のおっしゃる通りではないかと. 一応,下でご紹介させていただいた本を見てみると,ErrもExceptionも On Error~も載っているようですね.私はVBA始めたてで遊んでいたときに, On Error~もネットで見つけて拾ってきたので,それ以来.NETでも毎回使い続けているような感じです. 「非構造化例外処理」で検索すると詳しく出てくると思います. >例外は必要に応じて、自分で追加しよう!ってひどくないですか・・・ 確かにひどいっすねw 私の場合いつも新しい言語を勉強する際は, 最初に出来る限り厚い本を1冊辞書代わりに購入しています. よかったらページ数のある本を1冊買っておいて読んでみるといいかもしれません. 下の参考書は650p強で2600円です.ご参考になれば. お互い頑張りましょう^^
お礼
ありがとうございます。 本見てきました。 マイクロソフト公式本買ってるんですけどね・・
- MKT_
- ベストアンサー率56% (9/16)
No.3です.返信遅くなりました. エラーが発生した際にどのように対処を分岐させるかをif文で選択させる方法の中でも シンプルなものをご紹介いたしました. On Error Resume Next '「もしエラーが出た際は,無視して次の行へ移れ」の意味です. 'このコマンド以降でのエラー行はすべてスルーして次にうつります. '(つまり,この後エラーがまったく起こらなくなるので,バグ取り中は '注意が必要です.「On Error GoTo 0」を入れると解除できます.) Err.Clear() 'この後,エラー発生をとらえるためのErrを空にしておきます. : (エラーが出そうなコード) : If Err.Number <> 0 Then'もしここまででエラーが発生していた際,Errに '何らかの値が入っていますので,これを利用して分岐します. If MsgBox("エラー発生.続行しますか?", vbOKCancel, "実行確認") = vbOK Then Else MsgBox("終了しました") Exit Sub End If End If rescue98さんのなさりたいことってもしかすると,このシンプルなやり方で 解決できないかな??と思いましたので. ご参考になれば幸いです.
お礼
ありがとうございます。 Errを空にするとか・・・Errっていつ登場したのですか??? On Error Resume Next っていう構文も本に載ってないので。 あとの行のコードは理解できました。 これは、Win32 APIの書き方ですか? .NET Frameworkの本に載ってないのはなぜ???
- camputer
- ベストアンサー率64% (22/34)
こんにちは. 私の手元の本にはエラー処理方法が10ページほどにわたって書いてあったのでご紹介を. 秀和システム「Visual Basic 2008パーフェクトマスター」金城俊哉著 コードのご質問の件, On Error Resume Next Err.Clear() (エラーが出そうなコード) If Err.Number <> 0 Then If MsgBox("エラー発生.続行しますか?", vbOKCancel, "実行確認") = vbOK Then Else MsgBox("終了しました") Exit Sub End If End If としておけばどうでしょう.
お礼
ありがとうございます。 「秀和システム「Visual Basic 2008パーフェクトマスター」金城俊哉著」 本屋で一度見てみます。 Catch ex As Exception は Err.Number の派生で元は同じですか? Errオブジェクトは隠れて存在しているオブジェクトみたいですが、 On Error Resume Nextはどのようなことを行っていますか? On・・・On・・・使ったことないです。
- kazuhisa01
- ベストアンサー率32% (158/487)
例外処理というのは組むシステムによって本当に例外とするのか、エラーとするのかを決めます。 なので参考資料やホームページでは固定の例外処理を書いていません。 例えば・・・ 「日付変換でエラーが発生した場合、参考資料に例外処理としてLOGを出力して処理を異常終了させる。」 と載っていたとします。 しかし、システムとしては日付変換で例外が発生しても正常な値を返さず、Nothingを返却して処理を進めるという仕様の場合、参考資料が間違っているように見えてしまいます。 それを防ぐために例外処理は書かれていません。 優しくないと言われればそうかもしれませんが、例外処理をどんな組み方にも対応できるように書くのは不可能に近いです。
お礼
ありがとうございます。 本のプログラムを打っていて驚きました。 例外は必要に応じて、自分で追加しよう!ってひどくないですか・・・ 参考本なのに。 例外って勝手に生成されるんですよね? この形式を例外が発生しそうなとこに追加していけば、例外処理として機能しますか? Try メソッド() Catch ex As Exception MessageBox.Show("Exception Error : 1002) Throw(ex) End Try Throw(ex)すると、ポップアップをOKすると処理が続行されるということですか? Finally(ex)だとどうなりますか? ポップアップのOKを押すと、例外が発生するとプログラムを強制終了させたいです。 ご教授お願いしますmm
補足
Exception Error : 1002は、例外が発生した場所を知るためのマーキングです。
- neKo_deux
- ベストアンサー率44% (5541/12319)
本やネットでは、分かりやすく教示する事が目的だから。 例えば、「2つの数を入力し、その和を表示する」プログラムに、 ・入力文字が数字でなかったら? ・整数、実数型で取り扱えない数値が入力されたら? ・加算結果がオーバーフローしたら? なんて例外、エラーチェック処理を書いたら、そっちの処理の方が長くなり、そもそも教示したい、入力、演算、出力の処理がそういうものに埋もれてしまい、本筋として提示出来ません。
お礼
ありがとうございます。 本のプログラムを打っていて驚きました。 例外は必要に応じて、自分で追加しよう!ってひどくないですか・・・ 参考本なのに。 例外って勝手に生成されるんですよね? この形式を例外が発生しそうなとこに追加していけば、例外処理として機能しますか? Try メソッド() Catch ex As Exception MessageBox.Show("Exception Error : 1002) Throw(ex) End Try Throw(ex)すると、ポップアップをOKすると処理が続行されるということですか? Finally(ex)だとどうなりますか? ポップアップのOKを押すと、例外が発生するとプログラムを強制終了させたいです。 ご教授お願いしますmm
お礼
ありがとうございます。 Throwすると、エラーが発生した関数の処理はなかったことにして、 ボタンを押した段階の次のとこから復帰して再開されるわけですね。 続行するかは、致命的エラーのダイアログでユーザーに任せるということですね。 ユーザーはわかるわけもなく、戸惑うので、例外処理を書いて、 わかりやすい日本語でユーザーに説明する。 なるほど。 vbNewLine・・・ってなんでしょう・・・ .NETの本しか持ってないので、たぶんWin32 APIかな。。。 .NET Frameworkだけでは、ソフトが作れずWin32 APIも勉強しないといけないことを最近知りました。 Exceptionという隠れオブジェクトがあって、exに代入してexのMessageプロパティの値を表示しているわけですね。 MessageBox.Show(strEdit, "Test", MessageBoxButtons.OK, MessageBoxIcon.Information) '←※(1) ※(1)が処理されないということですね。 ふむふむ。 これが理想です! やっぱ、エラーが出たら落とすべきだと思いますが、エラーが出て続行は考えられません。 ~~~~~~~~~~~~~~~~~~~~~~~~~~ Try 例外が発生しそうな関数() Catch strEdit = String.Empty strEdit = "計算エラーが発生しています。" strEdit += vbNewLine strEdit += vbNewLine strEdit += "エラー内容: " strEdit += ex.Message MessageBox.Show(strEdit, "System Error", MessageBoxButtons.OK, MessageBoxIcon.Error) ' End 'システムを落とす End Try 大変な長文、ありがとうございました!!
補足
vbNewLineは、改行でした・・