• ベストアンサー

エラー処理

エラー処理について質問です。 私はどうもVBのエラー処理が頭についているせいか、Javaの例外処理等が面倒に見えてならないんです。 例えば下記はVBのエラー処理なんですが、引数を得て計算して値を返すというものなのですが、引数自体が間違えてたら意味ないということでチェックします。 色んなチェックをして1つでも間違えてたらVVV_ERRORに飛びます。 下記のように「桁数チェック」とか「数値か?」とか調べる場合、Javaだとどのようにして書いたらいいのでしょう? Javaならtry文に全部入れてしまえばいいのでしょうが… .....例 try { x = 10 / 5; y = 20 / 0; //エラー } catch ( ArithmeticException ex ) { System.out.println (" 0で割ることはできません"); .....略 要は下記VBのようにモジュールごとに独自のエラーコードが存在する場合、どうエラー処理を書いたらいいのかということです。 皆さんならどうしますか?よろしければご意見等お願い致します。 //////////////////////////////////////////////////////////////// public Function VVV(YYYYMMDD As String , Kotae As String) As String ...... vvv_err = "" On Error GoTo VVV_ERROR '***************引数チェック '8桁か? If Len(YYYYMMDD) <> 8 Then vvv_err = "8桁ではありません" GoTo VVV_ERROR End If '数値か? If IsNumeric(YYYYMMDD) = False Then vvv_err = "数値ではありません" GoTo VVV_ERROR End If .....略(同じようなIf文の引数チェックがたくさんあります) '***************ERROR処理 VVV_ERROR: vvv_err = vvv_err & err.Description & err.Number .....略

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

Javaについて勘違いしていませんか??Javaにもif文はありますし、また、Javaはtry-catchでチェックをしなければならないわけではありません。 例えば、Function VVVは以下のように書き換えることができます。 public String VVV(String YYYYMMDD, String Kotae) throws YYYException { if(YYYYMMDD.length()!=8) { throw new YYYException("8桁ではありません"); } try { Integer.parseInt(YYYYMMDD); } catch (NumberFormatException e) { throw new YYYException("数値ではありません"); } return "???"; } 例外についての詳しい説明は参考URLを参照してください。ちなみにEclipseを使えば例外をキャッチしなければいけない部分は補完してくれるし、それほど面倒ではなくなります。

参考URL:
http://www.y-adagio.com/public/standards/tr_javalang/11.doc.htm
akigiri0213
質問者

お礼

滅相もございません^^; 単に私の勉強不足です汗 書いていただいた例文でイメージをつかむことが出来ました。 色々調べていくうちに書いていただいた例文の意味がわかりました。 ドアホゥな質問をして申し訳ないです; お返事ありがとうございました!

その他の回答 (1)

回答No.1

私なら、Exceptionクラスを継承したクラスを自作して、チェック結果にひっかかった場合、自作したExceptionをthrowしますが。そうすれば任意の部分で処理を中断することも出来ますし、try-catch句内部でその他のExceptionが発生すればそれ自体もthrowすることができますし。 それで呼び出し側で自作したExceptionをcatchすればちゃんとエラーハンドルできますよね。 Exceptionを詳しく切り分ける必要がなければExceptionそのものをメッセージ付でnewして、throwしてもいけると思います。

akigiri0213
質問者

お礼

自作について色々調べてみました。 おかげさまで意味がわかりました。 きっかけになったことを感謝します^^ お返事ありがとうございました!

関連するQ&A

  • VBでのエラー処理(On Error)

    VBで以下のようなプログラムを書いています。 sub On Error goto Err 処理1 Err: 処理2 End sub 処理1でエラーが発生した場合、Err:の処理に入ってくるのですが、もしErr:の中の処理2でもエラーが発生した場合、どうすればよいのでしょうか? Err:の中でもエラー処理ができるのでしょうか、それともロジックで回避しなければならないのでしょうか? ご存知の方がいらっしゃいましたら宜しくお願いします。

  • 数が多い定数をスマートに処理するには?お知恵をお貸しください。

    Visual Basic(VB)6.0 です。フォームのTextなど各種入力の状態をチェックして、 不正なら該当する(ユーザ向けの)エラーメッセージを フォームのLabelに表示する処理を書いています。 エラーメッセージは20~30程度になり、全て定数Const文で持たせました。 随時発生する入力チェックの処理の度に、エラーならLabelのCaptionの表示を 変える処理を書くのはスマートではないと思ったので、 Label表示変更専用のモジュールを作ろうと考えました。 引数に(ユーザ定義の)コードを渡して、対応する定数のエラーメッセージを 判定・表示させる処理を書こうと思ったのですが、ここでうまくいきません。 以下、簡単なコードです。 ------------------------------------------------------ '* 定数です * Public Const ERR1 = "エラー1です" Public Const ERR2 = "エラー2です" Public Const ERR1 = "エラー3です" Public Const ERR2 = "エラー4です" '-----中略----- Public Const ERR50 = "エラー30です" ------------------------------------------------------- '** メイン処理です。** Sub main() Dim i As Integer 'フォームの入力をチェックします i = Chk_Value(dummy) If i > 0 Then '0より大きかったらエラーコードとして引数を渡します Call Disp_Msg(i) Exit Sub End If End Sub ------------------------------------------------------- '入力チェック処理です Private Function Chk_Value(ByVal dummy As Integer) As Integer '空白だったらエラーなので1を返します If Text1.Text = "" Then Chk_Value = 1 End If End Function ------------------------------------------------------- 'メッセージ表示処理です Private Sub Disp_Msg(ByVal ecd As Integer) '分からない! '引数で1を受け取り、定数のERR1を表示したい '引数で2を受け取ったら、定数のERR2を表示したい End Sub ------------------------------------------------------- 列挙型やType型変数もよい使い方が思いつかず、 ループで回して配列に格納しようにも、変数と変数を組み合わせて 変数を作る(wErr = "ERR" & i と書いても定数ERR1を表せない) のも無理なようだし、ほとほと困り果てています。 拙い説明で恐縮ですが、私の考えを実装することは可能でしょうか。 または別の方法はあるでしょうか。 よろしくお願いします。

  • on error 処理に関して

    on error goto での処理ルーチン内で、 さらに on error goto を出すことは可能でしょうか。 それとも、一度on errorを設定すると、エラーが発生した後では変更は不可なのでしょうか。 やりたいことは、 1回目と、2回目、3回目以降でやることとを変えたいのです。 例えば、メッセージを変えるとか。 この場合、 エラー処理の中で、何回目かを聞くことで、メッセージを変えることは出来ると思うのですが、 それはやらず、 他にも色々やることが多いので、別処理として飛びたいのです。 以下のようなイメージです。 err1: on error goto err2 resume next err2: on error goto err3 resume next err3: resume next 宜しくお願いします。

  • VBAのキャンセル処理

    下記のVBAでファイルを出力することはできるようになったのですが、 出力するときに[キャンセル]を押しても"MsgBox :Excelファイルへの出力が完了しました。"が表示されてしまいます。 「キャンセル」した場合は、このメッセージが表示されないようにできないでしょうか? Private Sub Image_Export_Click() On Error GoTo Err_FileDialog_Click 'ファイル出力 Dim strFileName As String Dim ExpFileName As String ExpFileName = "T_master_" & Format(Now(), "yyyymmdd") strFileName = GetFileName(False, "MicrosoftExcel ブック (*.xls)|*.xls", "", ExpFileName & ".xls") If Len(strFileName) = 0 Then 'キャンセルボタンが押されたときの処理を記述 MsgBox "キャンセルが押されました。" Else DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "T_master", strFileName & ".xls", True End If MsgBox "Excelファイルへの出力が完了しました。", , "出力完了" Exit_FileDialog_Click: Exit Sub Err_FileDialog_Click: MsgBox "予期せぬエラーが発生しました" & Chr(13) & _ "エラーナンバー:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbOKOnly End Resume Exit_FileDialog_Click End Sub

  • GETデータの&で区切った個々のエラー処理について質問です。

    GETデータ、たとえば http://www.yahoo.co.jp/test.cgi?data1=1237&data2=AK とある場合、$ENV{'QUERY_STRING'}の中のそれぞれの引数値に個別にエラー処理をかける方法を教えてください。順番はdata2が先頭にくるときもあればdata1が先頭にくるときもあります。data以外の文字はだめです。たとえばcode1=となるとエラーになるようにしたい。data1には数字4文字が入ります。data2には大文字の英字が入ります。 組み合わせはdata1=8544だけのときもありますし、 data1=1234&data2=KOのときもあったりばらばらです。 逆の場合もあります。data2=KO&data1=1234というふうに・・・。$ENV{'QUERY_STRING'} を&で分割して@getにいれてから、@getから&で区切られた個々の値を取り出す方法がわかりません。。。 どなたかご教授ねがいます。よろしくお願いいたします。以下のように書いたのですがうまくできません。 sub err_check{ if ( $FORM{'action'} eq "" ) { local(@get); if($ENV{'QUERY_STRING'} !~ /data1|data2|data3/) { &err2; } if (length($ENV{'QUERY_STRING'}) > 30) { &err2; } (@get)=split(/&/,$ENV{'QUERY_STRING'}); foreach $getname (@get) { ##data1のとき if ($data1){ if ($getname !~ /^media=[0-9]+[0-9]+[0-9]+[0-9]/) { &err2; } if (length($data1) > 6) { &err2; } if (length($data1) < 4) { &err2; } } ##data2のとき if($data2){ if ($getname !~ /^data2=[A-Z]+[A-Z]/) { &err2; } if (length($data2) ne 2) { &err2; } }  } }

    • ベストアンサー
    • Perl
  • EXCEL VBA ファイルが開かれているかチェックする処理

    ファイルを開く処理の前に、対象ファイルが開かれているかチェックして、開かれていたらエラーを表示する処理を以下のように記述したのですが、対象ファイルが開かれていないのにエラーになってしまいます。 エラーコードは『75』と表示されるのですが、ヘルプを見たり調べてみましたが、なぜエラーとなるのかが分かりません。 どなたか教えて下さい。宜しくお願いします。 ************************************************************* Public Path As String Public Fmei1 As String Public Full1 As String Public Error As String Private Sub CommandButton1_Click()   Path = "\\ディレクトリ1-1\ディレクトリ1-2\ディレクトリ1-3"   Fmei1 = "ファイル.xls"   Full1 = Path & "\" & Fmei1   Fopn End Sub Sub Fopn()   On Error Resume Next   Name Full1 As Full1   If Err.Number Then(←ここでエラーコード『75』となってしまいます)     Error = MsgBox("『ファイル.xls』を閉じて下さい。", _     vbCritical, "処理中断")     Err.Clear     End   Else     Workbooks.Open Filename:=Path & "\" & Fmei1   End If End Sub

  • EXCEL VBA のエラー処理

    EXCEL VBA でセルの文字列を読み(基本的に2007/05/08のような日付データが入っている)、 もしそれ以外のデータ("あいう"のような文字列)が入っていた場合はエラールーチンに飛ばして処理をしようと思ったのですが、 エラーが発生して、発生箇所が黄色く反転表示され、止まったままになってしまいます。 エラールーチンに飛ばすためにはどうしたらいいのでしょうか? Sub test() Dim LineNo As Integer Dim WrkDate As Date On Error GoTo Err LineNo = 1 WrkDate = Range("S" & LineNo).Value ←ここが黄色く反転表示される。 WrkDate = WrkDate + 7 Range("X" & LineNo).Value = WrkDate GoTo Owari Err: (処理ルーチン) Owari: End Sub

  • On ErrorでエラーNoが0

    On ErrorでエラーをトラップしてエラーNOとエラー内容をダイアログに表示させています。 Private Sub pv_sample() Dim errno as Long On Error GoTo ERR_END ' 処理内容略 Exit Sub ERR_END: errno = Err.Number MsgBox "システムエラー エラーNO(" & errno & ") 内容(" & Err.Description & ")" End Sub エラーが発生した場合はErr.Numberには0以外がセットされるはずですが 「システムエラー エラーNO(0) 内容()」 というメッセージが表示されることがあります。 On Eroorで飛んできたときにエラーNoが0になってしまうことはありえるのでしょうか。

  • エラー処理について。

    Accessマクロで、VBAに変換する際、「エラー処理コードを追加する。」に チェックを入れると出来る「エラー処理コード」についての質問です。 (1)このエラー処理コードは、プログラムの「異常終了」を防ぐと書いてありましたが、そもそもこの異常終了とはどのようなことを言ってるのでしょうか? (例えば、Accessが何の断りもなく、強制終了するなどといったことでしょうか。) 実際にマクロ(テーブルを開く)で作成されたエラーコードの部分だけを動かしてみて、どんなことになるのか試したいのですが、どうすれば試せるのですか? Function マクロ3() On Error GoTo マクロ3_Err DoCmd.OpenTable "テーブル1", acNormal, acEdit マクロ3_Exit: Exit Function マクロ3_Err: MsgBox Error$ Resume マクロ3_Exit End Function (2)そもそもエラー処理は、Access VBA開発ではかなり重要な要素なのでしょうか? 例えば、テキストボックスに何も入力されてなかったら、「入力してください。」とメッセージボックスを表示させるマクロを作るようなことは、 エラー処理とはまた違うのものなのですか?

  • Access VBAでのフィルタ処理

    アクセス2003を使用しています。 今VBAを使用して、フォームのテキストボックスに記入された文字列を検索条件に、 クエリからデータ抽出したいのですが、 うまくいきません。 解決したい事は、 「abc*」といったように、前方が一致している文字列データを すべて抽出するといった処理です。 今は下記のようなプログラムを組んでいます。 Private Sub コマンド1_Click() On Error GoTo Err_コマンド1_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "クエリ1" DoCmd.OpenQuery stDocName, acNormal, acEdit If IsNull(テキストボックス) Then Else stLinkCriteria = "[クエリデータ]=" & "'" & Me![テキストボックス] & "'" End If DoCmd.ApplyFilter stDocName, stLinkCriteria Exit_コマンド1_Click: Exit Sub Err_コマンド1_Click: MsgBox Err.Description Resume Exit_コマンド1_Click End Sub これだと完全に一致しなければ抽出してくれません。 どの様に変更すればよいでしょうか? よろしくお願いします。

専門家に質問してみよう