質問

VB6アプリケーションを持っています。エラーが何であったか、エラーが発生した正確な場所を教えてくれる、優れたエラー処理機能を入れたいのですが、誰かがこれを行う良い方法を提案できますか

役に立ちましたか?

解決

オンエラー後藤

そしてその

Err

物体。

チュートリアルがあります ここ.

他のヒント

まずは取りに行ってください Visual Basic 6 用 MZTools, 、無料で非常に貴重です。次に、すべての関数 (はい、すべての関数) にカスタム エラー ハンドラーを追加します。私たちが使用するエラー ハンドラーは次のようになります。

On Error GoTo {PROCEDURE_NAME}_Error

{PROCEDURE_BODY}

    On Error GoTo 0
    Exit {PROCEDURE_TYPE}

{PROCEDURE_NAME}_Error:

   LogError "Error " & Err.Number & " (" & Err.Description & ") in line " & Erl & _
            ", in procedure {PROCEDURE_NAME} of {MODULE_TYPE} {MODULE_NAME}"

次に、エラーをディスクに記録する LogError 関数を作成します。次に、コードをリリースする前に、すべての関数に行番号を追加します (これは MZTools にも組み込まれています)。今後は、発生したすべてのことをエラー ログから知ることができます。可能であれば、エラー ログもアップロードし、実際に現場からライブで検査してください。

これは、VB6 の予期しないグローバル エラー処理 (VB6 の多くの欠陥の 1 つ) に対してできる最善の方法であり、実際には、これは予期しないエラーを見つける場合にのみ使用する必要があります。特定の状況でエラーが発生する可能性があることがわかっている場合は、その特定のエラーを捕捉して処理する必要があります。特定のセクションで発生するエラーが不安定性 (ファイル IO、メモリの問題など) を引き起こすことがわかっている場合は、ユーザーに警告し、「不明な状態」にあり、「悪いこと」が起こる可能性があることを知らせます。ユーザーに情報を提供するために、明らかにフレンドリーな用語を使用しますが、恐怖を与えないでください。

追加のモジュールを必要としない簡単な方法で、クラス モジュールに役立ちます。

各関数/サブルーチンをプリエンプトします。

On Error Goto Handler

ハンドラー/バブルアップ:

Handler:
  Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description

ほら、ゲットーのスタック トレースです。

自家栽培のものを使用しています Error.bas モジュールを使用して、レポートと再レイズを簡単に行うことができます。

その内容は次のとおりです (長さのために編集されています)。

Option Explicit

Public Sub ReportFrom(Source As Variant, Optional Procedure As String)
    If Err.Number Then
        'Backup Error Contents'
        Dim ErrNumber As Long: ErrNumber = Err.Number
        Dim ErrSource As String: ErrSource = Err.Source
        Dim ErrDescription As String: ErrDescription = Err.Description
        Dim ErrHelpFile As String: ErrHelpFile = Err.HelpFile
        Dim ErrHelpContext As Long: ErrHelpContext = Err.HelpContext
        Dim ErrLastDllError As Long: ErrLastDllError = Err.LastDllError
    On Error Resume Next
        'Retrieve Source Name'
        Dim SourceName As String
        If VarType(Source) = vbObject Then
            SourceName = TypeName(Source)
        Else
            SourceName = CStr(Source)
        End If
        If LenB(Procedure) Then
            SourceName = SourceName & "." & Procedure
        End If
        Err.Clear
        'Do your normal error reporting including logging, etc'
        MsgBox "Error " & CStr(ErrNumber) & vbLf & "Source: " & ErrSource & vbCrLf & "Procedure: " & SourceName & vbLf & "Description: " & ErrDescription & vbLf & "Last DLL Error: " & Hex$(ErrLastDllError)
        'Report failure in logging'
        If Err.Number Then
            MsgBox "Additionally, the error failed to be logged properly"
            Err.Clear
        End If
    End If
End Sub

Public Sub Reraise(Optional ByVal NewSource As String)
    If LenB(NewSource) Then
        NewSource = NewSource & " -> " & Err.Source
    Else
        NewSource = Err.Source
    End If
    Err.Raise Err.Number, NewSource, Err.Description, Err.HelpFile, Err.HelpContext
End Sub

エラーの報告は次のように簡単です。

Public Sub Form_Load()
On Error Goto HError
    MsgBox 1/0
    Exit Sub
HError:
    Error.ReportFrom Me, "Form_Load"
End Sub

エラーを再発生させるのは呼び出しと同じくらい簡単です Error.Reraise 新しいソースで。

取得することは可能ですが、 Source そして Procedure シンボリック デバッグ情報を使用してコンパイルした場合、コール スタックからのパラメーターは、運用アプリケーションで使用するには十分な信頼性がありません。

はい、Kris のアドバイスに従い、MZTools を入手してください。

ERL がエラー ハンドラで報告する複雑なプロシージャの領域に行番号を追加して、エラーの原因となっている領域を追跡できます。

10
    ...group of statements
20
    ...group of statements
30
    ...and so on

使用する

dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"

On Error ステートメントと Err オブジェクトを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top