- ベストアンサー
VB6.0でランタイムエラーを全て出力する方法
- VB6.0で作成したプログラムの実行中に発生したエラーを全てログに出力し、後続処理を継続する方法を教えてください。
- 上記のプログラムでは、エラーが発生した場合に後続処理が中断されます。しかし、処理Aの後にもエラー情報を出力する処理を入れると、プログラムが冗長になります。そこで、どこでエラーが発生するか分からない前提とした場合、エラー情報を効率的に出力する方法はありませんか?
- 質問者はVB6.0で作成したプログラムの実行中に発生したエラーを全てログに出力し、後続処理を継続したいと考えています。しかし、既存の方法ではエラー情報を出力する部分が冗長になってしまいます。質問者の要望を実現するために、どのような方法がありますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
VB6.0自体には触れたことはないのですが(汗)、そこから派生した Access VBAでの経験から・・・ > 何か良い方法はありますでしょうか? 「On Error Resume Next」の代わりに、「On Error Goto」を 使用すれば、目的に適うのではないかと思います。 これを使用すると、エラー発生時には「GoTo」の後に示したラベル 位置のコードに処理が飛びます。 そこで、そのラベル位置以降に記載したコード(ここではエラーログを 記録するコード)を置き、その処理終了後、後続処理を続行する なら「Resume Next」を、エラー発生箇所の再試行を行うなら 「Resume」を、特定の行(→ラベルで指定)に飛ばすなら「Resume ラベル名」を、それぞれ指定します。 つまり、「On Error GoTo」と「Resume Next」の組み合わせを使用 すれば、「エラー発生のつど、ログを記録の上、後続処理を継続」が 可能となります。 あとは、エラーの発生位置を把握できるよう、適当な変数を設置して、 ログにその情報も含めてやればOkです。 Sub Main() 'エラー発生時は「エラー処理:」ラベル以降の処理に飛ばす On Error GoTo エラー処理 Dim Phase As Integer, sMsg As String 'エラー発生位置を特定するためのインデックス「Phase」を記録 Phase = 1 Err.Raise 12 '処理Aの代わり Phase = 2 Err.Raise 13 '処理Bの代わり Phase = 3 Err.Raise 14 '処理Cの代わり Phase = 4 Err.Raise 15 '処理Dの代わり 終了処理: '←ラベルであることを示すため、末尾に「:」をつけます。 'エラー発生時以外で「エラー処理:」移行のコードが実行されるのを避けます。 Exit Sub エラー処理: '必要に応じて、以下のような分岐処理を記述することもできます。 sPhase = "Phase=" & Phase & "にて、Err=" & Err.Number & "が発生しました。" Select Case Err.Number Case 12 MsgBox sMsg 'エラーログの記録の代わり Resume Next '【後続処理を継続】 Case 13: If MsgBox(sMsg, vbRetryCancel) = vbRetry Then Resume '【エラー発生箇所を再試行】 Else Resume 終了処理 '【処理中止(「終了処理」に移動)】 End If Case Else If MsgBox(sMsg, vbOkCancel) = vbOk Then Resume Next '【後続処理を継続】 Else Resume 終了処理 '【処理中止(「終了処理」に移動)】 End If End Select End Sub
その他の回答 (1)
- osamuy
- ベストアンサー率42% (1231/2878)
NTイベントログに出力するのがお手軽かつお勧め。
お礼
ご回答ありがとうございました。
お礼
ありがとうございました。この方法で実現できました。