Domanda

Ho un'applicazione VB6, voglio mettere un po 'di errore nella gestione della distinzione in esso che può dirmi qual è stato l'errore e il luogo esatto in cui è successo, qualcuno può suggerire il buon modo per farlo

È stato utile?

Soluzione

SU ERRORE GOTO

e

Err

oggetto.

Esiste un tutorial qui .

Altri suggerimenti

Prima di tutto, vai a MZTools per Visual Basic 6 , è gratuito e prezioso . In secondo luogo aggiungere un gestore di errori personalizzato su ogni funzione (sì, ogni funzione). Il gestore degli errori che utilizziamo assomiglia a questo:

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

Quindi creare una funzione LogError che registra l'errore su disco. Quindi, prima di rilasciare il codice, aggiungere i numeri di riga a ogni funzione (anche questa è integrata in MZTools). D'ora in poi saprai dai log degli errori tutto ciò che accade. Se possibile, inoltre, carica i log degli errori ed esaminali dal vivo dal campo.

Questo è il meglio che puoi fare per la gestione imprevista degli errori globali in VB6 (uno dei suoi numerosi difetti), e in realtà questo dovrebbe essere usato solo per trovare errori imprevisti. Se sai che se esiste la possibilità che si verifichi un errore in una determinata situazione, dovresti rilevare quel particolare errore e gestirlo. Se sai che un errore che si verifica in una determinata sezione causerà instabilità (File IO, problemi di memoria, ecc.) Avvisa l'utente e sai che sei in uno stato "sconosciuto". e che "cose ??cattive" probabilmente succederà. Ovviamente usa termini amichevoli per tenere informato l'utente, ma non spaventato.

un modo semplice senza moduli aggiuntivi, utile per i moduli di classe:

anticipa ogni funzione / sottotitoli:

On Error Goto Handler

handler / bubbleup:

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

voilà, traccia dello stack del ghetto.

Uso un modulo Error.bas cresciuto in casa per rendere meno ingombranti i rapporti e il rilancio.

Ecco il suo contenuto (modificato per lunghezza):

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

La segnalazione di un errore è semplice come:

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

Il rilancio di un errore è semplice come chiamare Error.Reraise con la nuova fonte.

Sebbene sia possibile recuperare i parametri Source e Procedure dallo stack di chiamate se si compila con informazioni di debug simboliche, non è abbastanza affidabile da utilizzare nelle applicazioni di produzione

Sì, segui i consigli di Kris e ottieni MZTools.

È possibile aggiungere numeri di riga per separare aree di procedure complesse, che ERL segnalerà nel gestore degli errori, per rintracciare l'area che causa l'errore.

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

Usa su

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

Utilizza l'istruzione On Error e l'oggetto Err.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top