On error goto ne fonctionne pas dans une boucle [Résolu]

Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Dernière intervention
1 avril 2013
- 7 nov. 2009 à 22:56 - Dernière réponse :
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Dernière intervention
1 avril 2013
- 8 nov. 2009 à 15:31
bonsoir à toutes et tous
j'ai pourtant l'habitude de gérer les erreurs mais je ne comprends pas le comportement de VB ici:
"For i = 2 To 15
path = App.path & "\Dicos" & i & "Def"
On Error GoTo erreur
MsgBox Err
Name path & "pasdef.txt" As path & "old_pasdef.txt"
Fichier = path & "old_PasDef.txt"
f = FreeFile(0)
Open Fichier For Input As #f
On Error GoTo 0
Do While Not EOF(f)
Input #f, buf
GetDef buf, path
Loop
Close #f
erreur:
On error goto 0
MsgBox Err

Next i"


à la première boucle si le fichier "pasdef.txt" n'existe pas le gestionnaire d'erreur m'envois bien l'erreur 53 et saute à l'étiquette erreur mais à la deuxième boucle, si le fichier "pasdef.txt" n'existe toujours pas, le gestionnaire d'erreur activé renvoi bien l'erreur 53 mais ne saute plus à la l'étiquette erreur .

Je ne comprends pas où est mon erreur????
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Dernière intervention
5 avril 2013
- 8 nov. 2009 à 08:06
3
Merci
Bonjour,

Oui... et on en parlait récemment encore dans une discussion ouverte par Casy ...

Detoutes manières, il faut, chaque fois que possible, éviter une gestion inutile de l'erreur, qu'il suffit de ne pas provoquer.
Dans ton cas par exemple (et sans analyse de tes instructions, dont tu es seul à décider), ceci évite ta gestion d'erreur (puisqu'il n'y en a pas ... :

For i = 2 To 15 
  path = App.path & "\Dicos" & i & "Def" 
  If dir(path & "pasdef.txt", vbnormal or vbhidden) <> "" then 
    Name path & "pasdef.txt" As path & "old_pasdef.txt" 
    Fichier = path & "old_PasDef.txt" 
     f = FreeFile(0) 
     Open Fichier For Input As #f 
        Do While Not EOF(f) 
          Input #f, buf 
          GetDef buf, path 
        Loop 
   Close #f 
   Kill Fichier 
Next i 

Merci jmf0 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de jmf0
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
- 8 nov. 2009 à 01:01
1
Merci
Salut
Err conserve sa valeur tant qu'une autre instruction n'a pas été exécutée.
MsgBox Err te renvoie donc la dernière erreur en mémoire.

Y a t-il une gestion d'erreur dans la Sub GetDef ?
Si tel est le cas, elle annule faite dans ces lignes ici.

A la sortie après le Close, tu passes ur l'étiquette Erreur, mais sans avoir d'erreur.
Les lignes qui suivent seront donc exécutées avec ou sans erreur - méfiance.
Ajouter un Exit Sub ou Exit Function avant l'étiquette Erreur

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Dernière intervention
1 avril 2013
- 8 nov. 2009 à 01:52
1
Merci
merci pour ton intéret
mais là n'est pas le problème à la deuxième boucle la valeur de err est bien à 0!
mais je viens de trouver sur un autre message:http://www.vbfrance.com/forum/sujet-PROBLEME-INSTRUCTION-ON-ERROR-GOTO_693869.aspx la réponse de "v.massip" : en fait le gestionnaire ne peut gérer qu'une erreur par procédure et il faut que l'erreur qu'il a traité soit terminée par l'instruction "resume"
donc j'ai réécrit comme ceci et ça fonctionne bien:

"
For i = 2 To 15
path = App.path & "\Dicos" & i & "Def"
On Error GoTo erreur
Name path & "pasdef.txt" As path & "old_pasdef.txt" 'renomme un fichier
Fichier = path & "old_PasDef.txt"
f = FreeFile(0)
Open Fichier For Input As #f
On Error GoTo 0
Do While Not EOF(f)
Input #f, buf
GetDef buf, path
Loop
Close #f
Kill Fichier 'suprime du disque dur le "fichier"
suite:
Next i
Exit Sub
erreur:
If Err = 53 Then 'si le fichier à renommer n'existe pas
Resume suite 'obliger de mettre une instruction résume pour remettre à zéro le gestionnaire d'erreur _
car le gestionnaire ne peut détourner qu'une erreur par procédure
Else
Error Err 's'il y avait une erreur inattendue!
End If
"
Commenter la réponse de cs_marco62118
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
- 8 nov. 2009 à 04:27
0
Merci
Ouh la, j'avais pas vu que tu avais mis la gestion d'erreur à l'intérieur d'une boucle = pas bien
Pour ce qui est du Resume, ils en parlent dans l'aide de On Error, je pensais que tu avais commencé par là ...
Commenter la réponse de cs_Jack
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Dernière intervention
5 avril 2013
- 8 nov. 2009 à 08:08
0
Merci
Pardon : un End If oublié avant Next I, hein ... bien sûr.
Commenter la réponse de jmf0
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Dernière intervention
5 avril 2013
- 8 nov. 2009 à 09:11
0
Merci
Si, par contre, ta question était plus "générale" et ton exemple n'était là que pour illustrer ce que tu voulais dire :
Je t'ai parlé plus haut d'une discussion ouverte récemment par Casy. La voilà :
http://www.vbfrance.com/forum/sujet-REINITIALISER-GESTIONNAIRE-ERREUR_1371449.aspx
Commenter la réponse de jmf0
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Dernière intervention
1 avril 2013
- 8 nov. 2009 à 15:31
0
Merci
bonjour
merci pour votre intéret, c'est vrai qu'il est plus simple , plus logique d'éviter de générer une erreur, mais souvent on essaie de résoudre le pb d'erreur après l'avoir subi!
Je pensais qu'avec on "error goto 0" ca pouvait terminer l'erreur de gestion
et dans les recherche sur le forum on ne trouve pas toujours les bonnes réponses car notre question ne se retrouve pas dans les intitulés des discusions

merci encore
Commenter la réponse de cs_marco62118

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.