Frage

Ich habe VB6-Anwendung, ich will Handhabung finction einige guten Fehler setzen darin, die mir sagen kann, was der Fehler war und die genaue Ort, wenn es passiert ist, kann man den guten Weg vorschlagen, dies zu tun

War es hilfreich?

Lösung

ON ERROR GOTO

und

Err

Objekt.

Es gibt ein Tutorial hier .

Andere Tipps

Zunächst einmal gehen bekommen MZTools für Visual Basic 6 , seine freien und von unschätzbarem Wert . Zweitens fügen Sie zu jeder Funktion eine benutzerdefinierte Fehlerbehandlung (ja, jede Funktion). Die Fehlerbehandlung verwenden wir in etwa so aussieht:

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}"

Dann erstellen Sie eine LogError Funktion, die den Fehler auf Disc protokolliert. Als nächstes, bevor Sie Code hinzufügen Zeilennummern zu jeder Funktion freigeben (dies wird auch in MZTools gebaut). Von nun an werden Sie wissen, von der Fehler protokolliert alles, was, was geschieht. Wenn möglich, lädt auch die Fehlerprotokolle und sie tatsächlich live aus dem Feld untersuchen.

Hier geht es um das Beste, was Sie für unerwartete globale Fehlerbehandlung in VB6 (einer seiner vielen Mängel) tun können, und sollte wirklich diese nur verwendet werden, unerwartete Fehler zu finden. Wenn Sie wissen, dass, wenn es die Möglichkeit eines Fehlers in einer bestimmten Situation auftreten, sollten Sie diesen speziellen Fehler fangen und für damit umgehen. Wenn Sie wissen, dass ein Fehler in einem bestimmten Abschnitt auftritt, wird Instabilität verursachen (File IO, Speicherprobleme, usw.) den Benutzer warnen und wissen, dass Sie in einem „unbekannten Zustand“ sind, und dass „schlechte Dinge“ sind wahrscheinlich passieren wird. Offensichtlich nutzen freundschaftlich der Benutzer darüber informiert zu halten, aber keine Angst.

eine einfache Möglichkeit, ohne zusätzliche Module, nützlich für die Klasse Module:

vorgreifen jede Funktion / subs:

On Error Goto Handler

Handler / Bubbleup:

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

voila, Ghetto-Stack-Trace.

Ich benutze einen home-grown Error.bas Modul Reporting zu machen und wieder Anheben weniger umständlich.

Hier ist der Inhalt (für Länge bearbeitet):

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

Einen Fehler melden ist so einfach wie:

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

reraising einen Fehler ist so einfach wie Error.Reraise mit der neuen Quelle aufrufen.

Es ist zwar möglich, die Source und Procedure Parameter aus dem Call-Stack abrufen, wenn Sie mit symbolischen Debug-Informationen kompilieren, es ist nicht zuverlässig genug, um in Produktionsanwendungen zu verwenden,

Ja, nehmen Sie Kris Rat und bekommen MZTools.

Sie können Zeilennummern Abschnitt Zone komplexer Prozeduren hinzufügen, das ERL in der Fehlerbehandlung berichtet, auf der Spur zu kommen, welcher Bereich die Fehler verursacht.

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

Verwenden Sie auf

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

Verwenden Sie die On Error-Anweisung und das Err-Objekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top