Erreur

Résolu
papi jim Messages postés 42 Date d'inscription vendredi 27 mai 2005 Statut Membre Dernière intervention 31 décembre 2005 - 30 juin 2005 à 12:10
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 - 1 juil. 2005 à 00:35
Bonjour, ya aurait-il une âme charitable pour me fournir qq
explications sur la gestion d'erreurs et les label, ou me passer un
lien l'expliquant (je dois mal chercher).

Voila mon probleme, je voudrais savoir quelle est la portée d'un 'on error' (1 bloc ou 1 fonction??)

Et je voudrais savoir pourquoi mon label 'erreurX:





faire...'

est executé meme sans erreur... (pour preuve mon err.description est vide)

il ne suufit pas de le placer a la fin de la fonction/sub et d'y faire
reference au on error, et il ne devrait pas etre zapé s'il n'y a pas
d'erreurs...?

merci a tous

8 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
30 juin 2005 à 12:17
Un On Error Goto LabelX ne vaut que dans la procédure ou il est utilisé.
Ensuite, si ton gestionnaire d'erreur (le code après ton LabelX: est éxécuter même si aucune erreur ne se produit, c'est parce que tu dois placer un "Exit Sub", ou un "Exit function", ou un "Exit Property" juste devant cette labelX:
En effet, pour VB, une label n'est riend 'autre qu'une balise marquant un point aprticulier du code et qu'il utilise pour débrancher le code au cas ou une erreur se produirait si tu as mis un On Error Goto LabelX, mais si VB atteind la label LabelX sans qu'une erreur ne se soit produite, cela ne le gêne pas et il poursuit avec le code sous la label. Ce fonctionnement est tout a fait normal et justifié dans l'esprit VB6. Voici un squelette de procédure avec gestionanire d'erreur "propre" :

Sub Foo()
On Error Goto ErrHdlr
' ...
' Code pouvant généré une erreur
' ...
Exit Sub

ErrHdlr:
' ...
' Code assurant la gestion d'erreur
' Avec un éventuel "Resume" ou "Resume Next" dedans
' ...
End Sub

En espérant t'avoir éclairer ...

Christophe
3
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
30 juin 2005 à 14:33
1- Impossible d'obtenir le N° dela ligne ayant causer une erreur en VB6 !!
2- Dans le cas de fonc/proc appelant une autre fonc/proc ... Si une erreur se produit dans la sous fonc/proc et qu'elle contient un gestionnaire d'erreur, c'est lui qui va capter l'erreur, sinon, ce sera un éventuel gestionnaire d'erreur dans la fonc/proc appelante. Pour faire simple, quand une erreur se produit dans une procédure/fonction, VB regade s'il y a un gestionnaire d'erreur dans cette procédure/fonction. S'il y en a un, il lui transmet le controle, sinon il regarde s'il y a un gestionnaire d'erreur dans la procédure/fonction appelante, et ainsi de suite jusqu'à arriver à la 1ere procédure/fonction du programme (si tu n'as mis aucun gestionnaire d'erreur) : L'erreur d'execution se produit alors ...
Ex :

Sub Foo1
On error Goto ErrHdlr
Call Foo2
Err.Raise vbObject + 100, "", "Mon Erreur dans Foo1"
Exit Sub
ErrHdlr:
Msgbox Err.Description & " capté par Foo1"
Resume Next
End Sub

' Version sans gestionnaire d'erreur
Sub Foo2
Err.Raise vbObject + 100, "", "Mon Erreur dans Foo2"
End sub

' Version avec gestionnaire d'erreur
Sub Foo2
On error Goto ErrHdlr
Err.Raise vbObject + 100, "Mon Erreur dans Foo2"
Exit Sub
ErrHdlr:
Msgbox Err.Description & " capté par Foo2"
End sub

Essaye ce bout de code en utilisant une puis l'autre version de Foo2, tu comprendra comment ca marche ...
Christophe R
3
papi jim Messages postés 42 Date d'inscription vendredi 27 mai 2005 Statut Membre Dernière intervention 31 décembre 2005
30 juin 2005 à 14:18
Merci bcp, je n'avais pas compris qu'un label fonctionnait ainsi.

Une derniere precision si ca ne t'embete pas, si ma fonction est assez
grande (mais pas tros non plus, mais elle fait appel a d'autre
fonction, et je ne pense pas pouvoir la reccourcir, je ne dois mettre
qu'un seul on error? si oui peut-on recuperer la ligne de code ou se
produit l'erreur?

De plus si une erreur se produit dans une fonction appellée par une
autre fonction, comment pourrais-je lancer label d'erreur de ma sous
fonction ( en fait je me sert du on error de la sous fonction que
pour recuperer le err.description), et celui de ma fonction, sans pour
autant spécifier dans ma sous fonction qui est sa fonction appellante,
mais tout en etant capable de recuperer son err.description pour
pouvoir l'ecrir dans le log a partir de la fonction principale...?
clair nan? bon ptet pas... :s

Merci a celui qui prendra le tps de dechiffrer ce ke jessai de dire...
0
papi jim Messages postés 42 Date d'inscription vendredi 27 mai 2005 Statut Membre Dernière intervention 31 décembre 2005
30 juin 2005 à 14:58
Ok merci, une derniere precision, y'a t il moyen de savoir dans Foo1 si l'erreur captée sors de foo2 ou de foo1 ?

Merci bcp en tt cas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
papi jim Messages postés 42 Date d'inscription vendredi 27 mai 2005 Statut Membre Dernière intervention 31 décembre 2005
30 juin 2005 à 15:14
ok c bon g capté =)

suffit de capter l'erreur de foo2 et de la relanceret changeant la desc un peu. Merci bcp.

++
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
30 juin 2005 à 21:51
Ou alors utiliser deux gfestionnaire d'erreur différent dans Foo1 ...

Sub Foo1
On Error Goto ErrHdlr1
'...
' Code propre à Foo1
'...
On Error Goto ErrHdlr2
Call Foo2
On Error Goto ErrHdlr1
'...
' Code propre à Foo1
'...
Exit Sub
ErrHdlr1:
Msgbox "Erreur dans le code de Foo1"
Exit Sub

ErrHdlr2:
Msgbox "Erreur dans Foo2 mais traitée par Foo1"
End Sub

Comme tu le vois il y a plusieurs façon de faire, à toi de voir celle qui correspond le mieux à tes besoin, ton humeur et ta façon personnelle de coder ...


Christophe
0
papi jim Messages postés 42 Date d'inscription vendredi 27 mai 2005 Statut Membre Dernière intervention 31 décembre 2005
30 juin 2005 à 23:59
Oui mais comme ma sous fonction risque d'etre appellée par plusieurs
fonctions et par forcement qu'une seul fois, je pense qu'il vaut mieux
gerer son propre message d'erreur dans foo2, nan?

En tout cas, merci d'avoir pris du tps pour m'expliquer tout ca.

JM

Et merci a vbfrance pour toute l'aide qu'il permet d'obtenir!
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
1 juil. 2005 à 00:35
Tu as raison, la gestion dans foo2 est conseillée ... a mon avis !?

Et de rien pour le coup de main ...

Christophe
0
Rejoignez-nous