web-dev-qa-db-fra.com

Pourquoi utiliseriez-vous jamais "On Error Goto 0"?

Pourquoi voudriez-vous utiliser "On Error Goto 0" dans une application VB6?

Cette instruction désactive le gestionnaire d'erreurs et signifierait que toute erreur planterait l'application. Pourquoi cela serait-il jamais souhaitable?

27
CJ7

Dans VB6, vous pouvez spécifier que vous souhaitez que les erreurs soient gérées par un code particulier plus tard dans la routine:

Sub Bar()
    On Error Goto MyHandler
    ...
    ...some code that throws an error...
    ...
    Exit Sub
MyHandler:
    ...some error handler code (maybe pops up a dialog)
End Sub

Il se peut cependant que le code qui génère l'erreur soit localisé et que vous ne souhaitiez pas ce même gestionnaire pour tout le reste du code de la routine. Dans ce cas, vous utiliseriez "On Error Goto 0" comme suit:

Sub Bar()
    ...
    On Error Goto MyHandler
    ...some code that throws an error...
    On Error Goto 0
    ...
    ...
    Exit Sub
MyHandler:
    ...some error handler code (maybe pops up a dialog)
End Sub

Maintenant, vous avez effectivement limité la gestion des erreurs pour qu'elle s'exécute uniquement si cette ligne de code particulière échoue.

En appelant "On Error Goto 0", vous ne dites PAS que vous souhaitez que l'application plante immédiatement. Vous dites simplement que vous souhaitez annuler l'enregistrement de tous les gestionnaires d'erreurs que vous avez peut-être configurés plus tôt dans la routine; les erreurs seront transmises dans la pile d'appels aux routines d'appel, comme d'habitude.

48
Matt Dillard

Puisqu'il semble maladroit de décrire avec des mots, voici quelques exemples montrant où vous pouvez utiliser On Error GoTo 0 pour une gestion localisée et structurée des erreurs.

Le premier est un Property Get dans une classe ("MicroDOM") qui implémente un DOM léger basé sur une hiérarchie de collections sous-classées. Dans ce cas, nous voulons tenter de référencer un enfant manquant par son nom au lieu d'index pour créer un enfant vide (sans attrbutes ni enfants):

Public Property Get Child(ByVal Key As Variant) As MicroDOM
    If mChildren Is Nothing Then
        Set mChildren = New Collection
    End If
    On Error Resume Next
    Set Child = mChildren(Key)
    If Err Then
        On Error GoTo 0
        If VarType(Key) = vbString Then
            Key = Trim$(Key)
            Set Child = New MicroDOM
            Child.Key = Key
            mChildren.Add Child, Key
        Else
            Err.Raise 9 'Subscript error as thrown by the Collection.
        End If
    End If
End Property

Le second est un code en ligne qui supprime un fichier s'il est présent:

On Error Resume Next
Kill strFilePath
On Error GoTo 0

Le troisième est un code en ligne qui ne prend une action que si un fichier se trouve être présent:

On Error Resume Next
GetAttr strFilePath
If Err Then
    On Error GoTo 0
    ProcessTheData strFilePath
End If
On Error GoTo 0

Bien que cela puisse paraître gênant pour les non-initiés (exécuter On Error GoTo 0 à deux endroits) le résultat est moins maladroit et plus structuré que d'avoir des radeaux de On Error GoTo Label qui va et vient pour traiter diverses exceptions.

Le bonus est que vous bénéficiez également de la portabilité vers VBScript, car On Error GoTo Label n'est pas du tout une construction valide.

8
Bob77

Il désactive uniquement la gestion des erreurs dans la procédure ACTUELLE. S'il existe un gestionnaire d'erreurs dans la procédure d'appel, il interceptera toutes les exceptions qui n'ont pas été gérées. VB continue de remonter la pile des appels jusqu'à ce qu'il trouve un gestionnaire d'erreurs. S'il n'en trouve pas ALORS, cela provoquera l'erreur d'exécution.

Donc, pour un exemple - vous avez peut-être une fonction wrapper qui appelle un utilitaire tiers qui peut lever une exception. Au lieu de gérer les exceptions dans la fonction wrapper, vous mettez un On Error Goto 0 là-dedans. Ainsi, l'appelant de la fonction wrapper obtiendra alors l'exception qui lui sera transmise et, espérons-le, la traitera correctement.

5
DJ.

Vous pouvez trouver ce lien utile: http://answers.Microsoft.com/en-us/office/forum/office_2010-Excel/why-on-error-resume-next-and-on-error-goto -0-have/a110548f-95c9-44ac-89bc-19697641804a? Auth = 1

Fondamentalement, il explique que le message On Error Resume Next indique VB pour ignorer les erreurs trouvées et passer à la procédure ou à la ligne suivante dans votre code, tandis que On Error GoTo 0 restaure la gestion des erreurs par défaut.

1
David