VB6.0でランタイムエラーを全て出力する方法

このQ&Aのポイント
  • VB6.0で作成したプログラムの実行中に発生したエラーを全てログに出力し、後続処理を継続する方法を教えてください。
  • 上記のプログラムでは、エラーが発生した場合に後続処理が中断されます。しかし、処理Aの後にもエラー情報を出力する処理を入れると、プログラムが冗長になります。そこで、どこでエラーが発生するか分からない前提とした場合、エラー情報を効率的に出力する方法はありませんか?
  • 質問者はVB6.0で作成したプログラムの実行中に発生したエラーを全てログに出力し、後続処理を継続したいと考えています。しかし、既存の方法ではエラー情報を出力する部分が冗長になってしまいます。質問者の要望を実現するために、どのような方法がありますか?
回答を見る
  • ベストアンサー

VB6.0で、ランタイムエラーを全て出力するには?

VB6.0で作成したプログラムの実行中にランタイムエラー(以後、「エラー」と記載)が発生した場合、 発生したエラーを全てログに出力し、後続処理を継続する方法を教えてください。 以下に詳細を示します。 '=============================== ' サンプル '=============================== Sub Main()   On Error Resume Next   処理A   処理B   処理C   処理D   If Err.Number <> 0 Then     Errの情報をログに出力   End If End Sub 例えば、上記プログラムの処理Aと処理Cでエラーが発生した場合、 それぞれのエラー情報を出力して、処理Dまでの処理を実行したいです。 しかし、上記のプログラムでは、処理Cのエラーによって処理Aでのエラーが上書きされてしまいます。 処理Aの後にも「Errの情報をログに出力」処理を入れれば良いのかもしれませんが、 実際のプログラムでは、どこでエラーが発生するか分からない前提としたいので、 この方法でエラーを出力しようとすると、プログラムが「Errの情報をログに出力」処理だらけになってしまいます。 何か良い方法はありますでしょうか?

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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

sons_of_liberty
質問者

お礼

ありがとうございました。この方法で実現できました。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

NTイベントログに出力するのがお手軽かつお勧め。

sons_of_liberty
質問者

お礼

ご回答ありがとうございました。

関連するQ&A

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

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

  • vbモーダルについて

    VB6.0について質問です。 FormAからFormBをモーダルで開き、さらにFormBからFormDをモーダルで開く という一連の操作を行いたいのですがうまくいきません>< エラー内容は、FromDを開く際にFormB内のデータが存在しなかったら FormDを表示せずにアンロードしたいのに表示されたままになってしまいます。 以下のコードで処理を行ってるのですがエラーのフラグを立ててアンロード処理を 行おうとしてもExitに移った瞬間にプログラムが終了してしまいます。 FormDをモーダレスで開くとアンロード処理まで普通に処理されます。 モーダルでアンロード処理までいくにはどのような処理を加えたらよいでしょうか? If i = 0 Then MsgBox "データありません。" Err_Flg = 1 Exit Sub End If ---------------------------- If Err_Flg = 1 Then Err_Flg = 0 Unload FormD End If

  • 二つのエラーを発生させたい

    ひとつのプロシージャー内で、 二つのエラートラップを仕掛ける事は出来ないのでしょうか? Sub エラーが発生した時にエラーが発生したら() Dim i As Long On Error GoTo Err1 i = "a" Exit Sub Err1: MsgBox "Err1のエラー: " & Err.Description On Error GoTo Err2 i = "b" Exit Sub Err2: MsgBox "Err2のエラー: " & Err.Description End Sub を行うと、 i = "b" で2回目のエラーが発生した時は、 実行時エラーになってしまいます。 i = "b" で2回目のエラーが発生した時に、 「Err2のエラー: 型が一致しません。」 と表示させるにはどうすればいいでしょう? Sub エラーが発生した時にエラーが発生したら() Dim i As Long On Error GoTo Err1 On Error GoTo Err2 i = "a" Exit Sub Err1: MsgBox "Err1のエラー: " & Err.Description i = "b" Exit Sub Err2: MsgBox "Err2のエラー: " & Err.Description End Sub にすると、 i = "a" のエラーで、 「Err2のエラー: 型が一致しません。」 へ移動してしまいます。

  • エラーメッセージをコピーするには?

    例えば Sub test() Dim i As Integer i = "a" End Sub というコードは 実行時エラー13が発生します。 このエラーメッセージの内容をコピーする事は可能でしょうか? エラー処理をし err.Descriptionで取得するしかないですか?

  • VBに関するエラー

    Option Explicit Private CN As New ADODB.Connection Private RSOUT, RSOUT2, RSOUT3 As New ADODB.Recordset Private mysql1, mysql2,mysql3 As String ------------------------------------------------ Private Sub CMD_Action_Click() On Error GoTo err_form_load CN.Open "PROVIDER=MSDASQL;dsn=TYO;uid=;pwd=;" mysql3 = "SELECT Tabel1.A,Tabel1.B sum(mysql3.Tabel1.A) as C, sum(Tabel1.B) as D From Tabel1" RSOUT3.Open mysql3, CN, adOpenStatic mysql2 = "SELECT RSOUT3.C , RSOUT3.D From RSOUT3" RSOUT2.Open mysql2, CN, adOpenStatic FileName = "C:\表.csv" Open FileName For Output As #1 '出力分 省略 Close #1 MsgBox "出力完了しました。", vbOKOnly, Title:="知らせ" Exit Sub err_form_load: MsgBox (Err.Number & Chr(13) & Err.Description) Exit Sub End Sub ------------------------------------------------- 質問:mysql2のところに、mysql3のrecordを利用したいですが、そのままRSOUT3.recordをmysql2に利用すると、”オブジェクトが必要”のエラーメッセージが出た。どこ間違いましたか?  よろしくお願いいたします。

  • 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になってしまうことはありえるのでしょうか。

  • VB.NETでの宣言エラー表示について

    下記のようなコーディングをしていますが、 「subStartProcは、宣言されていません」のエラーになります。 どなたかご教示ください。 今回がVB.NET初めてで、さっぱりわかりません。 Private Sub btnMenu1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMenu1.Click Try ' プロシージャ開始ログ出力 Call C_LogWrite("btnMenu1_Click" & " Enter...", ComDefH.LogLevel.L_INFO) Call subStartProc() ←  subStartProcは、宣言されていません Catch ex As Exception '' プロシージャエラーログ出力 Call C_LogWrite("btnMenu1_Click" & " Error Exception...", ComDefH.LogLevel.L_ERROR) Call C_LogWrite(ex.StackTrace, ComDefH.LogLevel.L_ERROR) Finally '' プロシージャ終了ログ出力 Call C_LogWrite("btnMenu1_Click" & " Exit...", ComDefH.LogLevel.L_INFO) End Try End Sub #End Region #Region "ファイル送信開始" '------------------------------------------------------- ' [関数名] subStartProc ' [機 能] ファイル送信開始 ' [引 数] '------------------------------------------------------- Private Sub subStartProc() Dim objFSO As clsFile Dim intUriFlg As Integer = 0 Dim strMsg As String = "" Try '' プロシージャ開始ログ出力 Call C_LogWrite("subStartProc" & " Enter...", ComDefH.LogLevel.L_INFO) mlblMsg.Text = "データ送信中です。暫らくお待ち下さい。" Application.DoEvents() '<売上ファイル> '売上ファイル存在確認 objFSO = New clsFile(cgstrDATA_DAT_PATH1, cgstrUriage_nam1) If objFSO.FileExists = True Then mlblMsg.Text = "仕入ファイルの送信中・・・" Application.DoEvents() If fncSendProc("1") = True Then '売上ファイルを削除 If fncDeleteFile("1") = False Then mlblMsg.Text = "仕入ファイルの削除に失敗しました。システム担当に連絡ください。" Exit Sub End If Else mlblMsg.Text = "仕入ファイルの送信に異常が発生しました。再度、送信を行ってください。" & _ "<" & gobjFtpErrcd & ">" Exit Sub End If intUriFlg = 1 mlblMsg.Text = "仕入ファイルの送信完了" Application.DoEvents() End If If intUriFlg = 0 Then mlblMsg.Text = "送信対象ファイルは存在しません。" Application.DoEvents() Else If intUriFlg = 1 Then strMsg = "「仕入ファイル」" End If mlblMsg.Text = strMsg & "を送信しました。" Application.DoEvents() End If '確定音を鳴らす。 ARK_Beep.StartParam(Convert.ToUInt32(cgintFreqK), Convert.ToUInt32(cgintVolumeK), _ Convert.ToUInt32(cgintCountK), Convert.ToUInt32(cgintOntimBeepK), _ Convert.ToUInt32(cgintOfftimBeepK)) Catch ex As Exception '' プロシージャエラーログ出力 Call C_LogWrite("subStartProc" & " Error Exception...", ComDefH.LogLevel.L_ERROR) Call C_LogWrite(ex.StackTrace, ComDefH.LogLevel.L_ERROR) Finally '' プロシージャ終了ログ出力 Call C_LogWrite("subStartProc" & " Exit...", ComDefH.LogLevel.L_INFO) End Try End Sub #End Region

  • 実行時エラー92 forループが初期化されていませ

    エクセルVBAでFor Eachを使ってるのですが、 Nextの部分で 実行時エラー92 forループが初期化されていません。 というエラーになります。 On Error GoTo ERR1 For Each myObj In objIE.Document.all.tags("ul") If myObj.className = "" Then '○○の場合 Exit Sub ERR1: If Err.Number = 424 Then On Error GoTo 0 'エラーを解除 '▲▲の場合 If strカテゴリ Like "" Then Exit Sub End If End If End If Next というコードなのですが、どこかおかしいですか?

  • ループの中で何度もエラー処理をしたい場合

    サンプルコードを掲載します。 実際はセルの文字を取得するのでこのコードとは違いますが、形は同じです。 Sub test() Dim i As Long On Error GoTo Err1 For i = 0 To 5 i = "a" Err1: Debug.Print i "は、エラーになりました" Next End Sub このようなコードの場合、 i=0の時に、1回目のエラーになって 「0は、エラーになりました」が返りますが、 その後、i=1になった時に i = "a"を実行すると On Error GoTo Err1が無視され、エラーになってしまいます。 ループの中でエラーが何度発生してもエラー処理をする方法はありますか? On Error Resume Next以外の方法で教えてください。

  • 標準エラー出力の可否操作について

    unix-cプログラムにてpopen()等により実行した結果、 popen()の引数に設定したコマンドのパスが設定されていない場合 標準エラー出力をはいてしまいます。 close(2)を実行することにより出力はまぬがれるのですが、 他箇所の標準エラー出力は表示させたいためclose(2)では実現できません。 何かpopen()実行時の標準エラー出力をさせず処理を進める良い方法はありませんでしょうか

専門家に質問してみよう