gestion d'erreurs [résolu] - VB/VBA/VBS - Programmation
Marsh Posté le 13-04-2004 à 14:57:00
lhonolulu a écrit : J'ai un programme qui tourne en boucle pour plusieurs clients. s'il y a une erreur d'éxécution dans le programme alor j'ouvr le fichier "erreur" et je rentre le nom du client,n°erreur...Et a la fin d'aller a un autre client : |
les erreurs des programmes pour les gérer c'est :
Code :
|
Dans la gestion d'erreur tu peux mettre une étiquette qui renverra à ton code, mais c'est pas trés propre, normalement ton code ne doit pas générer d'erreur et doit prendre à 98% toutes les possibilités de l'utilisateur. Les 2% restants sont les erreurs que tu n'auras pas vu aprés des heures de recherches. La meillieur façon de les trouver c'est de simuler....
Code :
|
Marsh Posté le 13-04-2004 à 15:06:29
en fait je fait tourner des requetes sql pour beaucoup de clients. Donc c pa gérer les éventuels problème dans les requetes. S'il y a un replace ki a raté a cause d'une otre orthographe ou des truc comme ca.
Donc s'il y a une erreur je veux qd mm que le programme fasse tourner les autres requetes.
Marsh Posté le 13-04-2004 à 15:09:53
lhonolulu a écrit : en fait je fait tourner des requetes sql pour beaucoup de clients. Donc c pa gérer les éventuels problème dans les requetes. S'il y a un replace ki a raté a cause d'une otre orthographe ou des truc comme ca. |
je t'ai donne la gestion des erreurs sous VB et ca marchera à toutes les erreurs, sauf erreur de ma part.
edit : Ton code génére une erreur, si je me trompe pas c'est un code qui permet d'ouvrir un fichier ? tu compte l'avertir d'une erreur d'ouverture ou non et des raisons ?
Marsh Posté le 13-04-2004 à 16:08:42
Mon prog tourne en boucle sur tout des clients et sur tout les fichiers de ces clients (une double boucle). Mon code permet de lancer automatiquement toutes les requetes contenu dans les fichiers. avec ta gestion des erreurs je ne retourne pas dans mon code pour faire tourner une autre requete car ton goto me ramène a la gestion des erreurs. et dc mon code s'arrete a la 1ère erreur. C pourquoi dans mon 1er mess j'ai fé un dans mon gestionnair d'erreur un goto pour kil lance les autres requetes.
dans ma gestion des erreur j'ouvr le fichier erreur et je met quelques description de type :
Print #1, " erreur : " & Err.Number & " - " & Err.Description
Marsh Posté le 13-04-2004 à 16:16:22
lhonolulu a écrit : Mon prog tourne en boucle sur tout des clients et sur tout les fichiers de ces clients (une double boucle). Mon code permet de lancer automatiquement toutes les requetes contenu dans les fichiers. avec ta gestion des erreurs je ne retourne pas dans mon code pour faire tourner une autre requete car ton goto me ramène a la gestion des erreurs. et dc mon code s'arrete a la 1ère erreur. C pourquoi dans mon 1er mess j'ai fé un dans mon gestionnair d'erreur un goto pour kil lance les autres requetes. |
je te renvoie au code de ton programme avec mon code, le GOTO "retour_code" se positionne avant l'ouverture de ton fichier. Ton code ne gére pas les erreurs ! T'as mise l'étiquette avant l'ouverture de ton fichier ce que je comprends pas trés bien d'allieur ! et à la fin de ton code tu retourne avant le "on error goto"...Bref, c'est un peu si je me permettre de te le dire, folklorique ! Je t'ai mis la gestion des erreurs (1er code) sous Vb et il y en n'as pas 50...
Ton code tourne fait tourner en boucle, l'ouverture de ton fichier, pour ça utilse les boucles do While ou for next, mais pas les étiquettes
Marsh Posté le 13-04-2004 à 16:47:49
mon algo est :
- sélectionner les clients dont je veux faire une étude
- Pour chaque client sélectionné j'ouvre 1 à 1 les fichiers texte de ce dossier en les exécutant car se sont des requetes
- pour chaque requête (or mis les créations de table) je met les résultats dans un fichier excel ou texte automatiquement
- s'il y a une erreur (faute dans les requetes, trop de ligne pour excel...)j'ouvre mon fichier erreur et je met les caractéristques de l'erreur
- sur le client où il y a eu l'erreur je passe a un autre fichier de ce client (autre requete) ou à un autre client si ct le dernier fichier.
je ne veux pas gérer les erreurs mais juste dire qu'il y a eu une erreur.
Je fais tourner en boucle l'ouverture et la fermeture de mon fichier "erreur" tant qu'il y a des erreurs.
en résumé : je fais tourner des requêtes 1 à 1
s'il y a une erreur dans une requete ou export ou quoi que ce soit je met le descriptif dans mon fichier erreur ensuite je passe a une autre requete.
Mm s'il y a une erreur je repar au tout début de mon prog afin de pouvoir lancer toute mes requetes.
a mon avis on a du mal a se comprendr...lol ! car je ne voi vrémen pas commen dans ton code je fé tourner en boucle mes requetes...je fais juste tourner en boucle mon fichier d'erreur...ce ke je t'accorde est assez folklo
Marsh Posté le 13-04-2004 à 17:05:06
lhonolulu a écrit : mon algo est : |
Toute erreur fait planter un programme, donc la gestion est obligatoire pour éviter de passer pour un imbécile ! aprés y a des messages ou non, celon les choix que l'on fais ! Dans le code que je te mets c-dessous, même en cas d'erreur, ton code continue à tourner et tu comptabilise les erreurs que t'as eue, c'est ce que je te dis depuis le départ ! Aprés si tu veux détailler les erreurs de chacun c'est plus chiant
Code :
|
Marsh Posté le 13-04-2004 à 17:11:22
cvb> pour que ton code soit fiable, il faut l'étiquette initiale avant le on error:
Code :
|
Parce si ça plante une seconde fois en étant passé une seule fois dans le On Error, ça te ramène dans la fonction parente (et éventuellement la gestion d'erreur par défaut -> crac boum -> fin de programme)
Donc, quand une erreur a été déclenchée, puis qu'on veut revenir dans le traitement, il faut repasser par le On Error...
Marsh Posté le 13-04-2004 à 17:12:27
c'est ce que g fé...mais ca ne marche qu'une seule fois. la 1ère fois il vb va bien dans le gestionnaire d'erreur mais dés la 2ème fois ca fait comme s'il n'existait pas...
Marsh Posté le 13-04-2004 à 17:14:42
oui, parce que quand l'erreur est déclenchée, le On Error est oublié, faut repasser dessus (cfr mon précédent post)
Marsh Posté le 13-04-2004 à 17:15:08
drasche a écrit : cvb> pour que ton code soit fiable, il faut l'étiquette initiale avant le on error:
|
au temps pour moi !
Code :
|
Marsh Posté le 13-04-2004 à 17:26:28
lhonolulu a écrit : c'est ce que g fé...mais ca ne marche qu'une seule fois. la 1ère fois il vb va bien dans le gestionnaire d'erreur mais dés la 2ème fois ca fait comme s'il n'existait pas... |
t'as oublié de sortir de la procédure ou de la fonction, avec exit 'sub' ou 'fonction'
Code :
|
Marsh Posté le 13-04-2004 à 17:28:42
déjà esseyé et marche pas...snif.
G fé un pti truc pour tester toutes les possibilités en désespoire de cause.
l = 0
aller: l = l + 1
On Error GoTo oups
If l < 5 Then
i = 1 / 0
End If
Exit Sub
oups:
MsgBox ("erreur" )
GoTo aller
End Sub
Mais là oci il ne passe qu'une fois...
Marsh Posté le 13-04-2004 à 17:32:50
ok j'ai dit une connerie (ce sera pas la dernière ), en fait c'est pas Goto aller mais Resume aller.
Marsh Posté le 13-04-2004 à 17:34:00
c'est même pire que ça: le Resume ne "casse pas" le On Error, donc le label de début peut aussi bien se trouver après
Marsh Posté le 13-04-2004 à 17:39:53
bien joué matrix ! lol ! merci ca marche enfin ! je t'aime toi ! lol !
merci a toi et à cvb
donc si on veut gérer plusieurs à la suite (sans exit) il faut utiliser resume. je m'en souviendrai.
Marsh Posté le 13-04-2004 à 14:37:17
J'ai un programme qui tourne en boucle pour plusieurs clients. s'il y a une erreur d'éxécution dans le programme alor j'ouvr le fichier "erreur" et je rentre le nom du client,n°erreur...Et a la fin d'aller a un autre client :
S'il y a une seule erreur cela marche. Mais s'il y a une 2ème erreur alors j'obtient l'alerte vb avec la possibilité de débogage.
J'ai fait un gestionnaire d'erreur tout bête avec on error goto oups
aller : l = l + 1
On Error GoTo oups
...instructions
oups:
Open "D:\Stage\Ludovic\erreur.txt" For Append As #1
Print #1, ""
Print #1, "erreur : client " & selection.LstClients_Pays.List(l - 1)
Print #1, ""
Close #1
GoTo aller
J'ai du oublié un truc pour kil gére chaque erreur et non que la 1ère
merci
Message édité par lhonolulu le 14-04-2004 à 14:14:58