qual è il modo migliore per gestire gli errori in VB6
-
02-07-2019 - |
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
Soluzione
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.