was ist der bessere Weg, um Fehler in VB6 zu handhaben
-
02-07-2019 - |
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
Lösung
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.