cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 2013
-
7 nov. 2009 à 22:56
cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDerniè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 .
jmf0
Messages postés1566Date d'inscriptionmardi 26 décembre 2000StatutMembreDernière intervention 5 avril 20138 8 nov. 2009 à 08:06
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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 8 nov. 2009 à 01:01
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)
cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 20131 8 nov. 2009 à 01:52
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
"
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 8 nov. 2009 à 04:27
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à ...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 20131 8 nov. 2009 à 15:31
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