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?

Était-ce utile?

La solution

ON ERROR GOTO

et le

Err

objet.

Un tutoriel ici .

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top