what is the better way to handle errors in VB6

前端 未结 7 675
再見小時候
再見小時候 2020-11-30 06:43

I have VB6 application , I want to put some good error handling finction in it which can tell me what was the error and exact place when it happened , can anyone suggest th

相关标签:
7条回答
  • 2020-11-30 07:16

    Yes, take Kris's advice and get MZTools.

    You can add line numbers to section off areas of complex procedures, which ERL will report in the error handler, to track down which area is causing the error.

    10
        ...group of statements
    20
        ...group of statements
    30
        ...and so on
    
    0 讨论(0)
  • 2020-11-30 07:17

    I use a home-grown Error.bas module to make reporting and re-raising less cumbersome.

    Here's its contents (edited for length):

    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
    

    Reporting an error is as simple as:

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

    Reraising an error is as simple as calling Error.Reraise with the new source.

    Although it is possible to retrieve the Source and Procedure parameters from the call stack if you compile with symbolic debug info, it's not reliable enough to use in production applications

    0 讨论(0)
  • 2020-11-30 07:18

    Use on

    dim errhndl as string
    on error goto errhndl
    errhndl:
    msgbox "Error"
    
    0 讨论(0)
  • 2020-11-30 07:19

    First of all, go get MZTools for Visual Basic 6, its free and invaluable. Second add a custom error handler on every function (yes, every function). The error handler we use looks something like this:

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

    Then create a LogError function that logs the error to disc. Next, before you release code add Line Numbers to every function (this is also built into MZTools). From now on you will know from the Error Logs everything that happens. If possible, also, upload the error logs and actually examine them live from the field.

    This is about the best you can do for unexpected global error handling in VB6 (one of its many defects), and really this should only be used to find unexpected errors. If you know that if there is the possibility of an error occurring in a certain situation, you should catch that particular error and handle for it. If you know that an error occurring in a certain section is going to cause instability (File IO, Memory Issues, etc) warn the user and know that you are in an "unknown state" and that "bad things" are probably going happen. Obviously use friendly terms to keep the user informed, but not frightened.

    0 讨论(0)
  • 2020-11-30 07:30

    a simple way without additional modules, useful for class modules:

    pre-empt each function/subs:

    On Error Goto Handler
    

    handler/bubbleup:

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

    voila, ghetto stack trace.

    0 讨论(0)
  • 2020-11-30 07:32

    ON ERROR GOTO

    and the

    Err
    

    object.

    There is a tutorial here.

    0 讨论(0)
提交回复
热议问题