15

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

4

7 に答える 7

30

まず、MZTools for Visual Basic 6 を入手してください。これは無料で非常に価値があります。次に、すべての関数 (はい、すべての関数) にカスタム エラー ハンドラーを追加します。使用するエラー ハンドラは次のようになります。

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 の予期しないグローバル エラー処理 (多くの欠陥の 1 つ) に対して実行できる最善の方法であり、実際には、これは予期しないエラーを見つけるためにのみ使用する必要があります。特定の状況でエラーが発生する可能性があることがわかっている場合は、その特定のエラーをキャッチして処理する必要があります。特定のセクションで発生するエラーが不安定性 (ファイル IO、メモリの問題など) を引き起こすことがわかっている場合は、ユーザーに警告し、「不明な状態」にあり、「悪いことが起こる可能性がある」ことを知らせます。ユーザーに情報を提供し続けるために友好的な言葉を使用することは明らかですが、怖がらせないようにしてください。

于 2008-09-22T17:40:32.377 に答える
13

クラスモジュールに役立つ、追加のモジュールを使用しない簡単な方法:

各関数/サブを横取りします:

On Error Goto Handler

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

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

出来上がり、ゲットースタックトレース。

于 2008-09-22T18:11:18.857 に答える
4

私は自家製の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、本番アプリケーションで使用するには十分な信頼性がありません。

于 2008-09-24T17:43:43.320 に答える
3

エラー後藤

そしてその

Err

物体。

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

于 2008-09-22T17:42:10.110 に答える
1

使用する

dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"
于 2016-08-23T21:41:08.490 に答える
1

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

ERL がエラー ハンドラで報告する複雑な手順のセクション オフ領域に行番号を追加して、エラーの原因となっている領域を追跡できます。

10
    ...group of statements
20
    ...group of statements
30
    ...and so on
于 2008-09-22T17:51:22.803 に答える
0

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

于 2008-09-22T17:40:59.333 に答える