quel est le meilleur moyen de gérer les erreurs dans VB6
-
02-07-2019 - |
Question
J'ai une application VB6, je veux y insérer une bonne solution de traitement des erreurs qui peut me dire quelle était l'erreur et l'endroit exact où cela s'est produit. Quelqu'un peut-il suggérer le bon moyen de le faire?
La solution
Autres conseils
Tout d'abord, procurez-vous MZTools pour Visual Basic 6 , un outil gratuit et précieux. . Deuxièmement, ajoutez un gestionnaire d’erreurs personnalisé sur chaque fonction (oui, chaque fonction). Le gestionnaire d'erreur que nous utilisons ressemble à ceci:
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}"
Créez ensuite une fonction LogError qui enregistre l’erreur sur le disque. Ensuite, avant de libérer le code, ajoutez des numéros de ligne à chaque fonction (cela est également intégré à MZTools). A partir de maintenant, vous saurez dans les journaux d'erreurs tout ce qui se passe. Si possible, téléchargez également les journaux d'erreurs et examinez-les en direct depuis le terrain.
C’est à peu près tout ce que vous pouvez faire de mieux pour la gestion des erreurs globales inattendues dans VB6 (l’un de ses nombreux défauts) et cela ne devrait en réalité être utilisé que pour rechercher des erreurs inattendues. Si vous savez que s’il est possible qu’une erreur se produise dans une situation donnée, vous devez intercepter cette erreur et la gérer. Si vous savez qu'une erreur survenant dans une section donnée va provoquer une instabilité (IO de fichier, Problèmes de mémoire, etc.), avertissez l'utilisateur et sachez que vous vous trouvez dans un " état inconnu ". et que "mauvaises choses" vont probablement arriver. Évidemment, utilisez des termes amicaux pour tenir l'utilisateur informé, mais sans avoir peur.
un moyen simple, sans modules supplémentaires, utile pour les modules de classe:
préemptez chaque fonction / sous-programme:
On Error Goto Handler
gestionnaire / bubbleup:
Handler:
Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description
voila, trace de pile ghetto.
J'utilise un module Error.bas
développé localement pour rendre les rapports et les réévaluations moins lourds.
Voici son contenu (édité pour la longueur):
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
Signaler une erreur est aussi simple que:
Public Sub Form_Load()
On Error Goto HError
MsgBox 1/0
Exit Sub
HError:
Error.ReportFrom Me, "Form_Load"
End Sub
Relancer une erreur est aussi simple que d’appeler Error.Reraise
avec la nouvelle source.
Bien qu'il soit possible d'extraire les paramètres Source
et Procedure
de la pile d'appels si vous compilez avec des informations de débogage symboliques, ce n'est pas assez fiable pour les applications de production
Oui, suivez les conseils de Kris et procurez-vous MZTools.
Vous pouvez ajouter des numéros de ligne à des sections de procédures complexes que ERL indiquera dans le gestionnaire d'erreurs pour déterminer la zone à l'origine de l'erreur.
10
...group of statements
20
...group of statements
30
...and so on
Utiliser sur
dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"
Utilisez l'instruction On Error et l'objet Err.