IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Gestion d'erreur dans une boucle


Sujet :

VB 6 et antérieur

  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Par défaut Gestion d'erreur dans une boucle
    Bonjour,

    Je réalise une fonction de traduction qui récupère la liste des éléments et en fonction du type d'élément change le caption ou le text.

    En cas d'erreur sur un élément, je réalise un Log et poursuit.

    Cela fonctionne pour la 1ère erreur, mais plante lors d'une deuxième erreur, et je ne vois pas pourquoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    While Not Rs1.EOF
     
            NomFenetre = Rs1.Fields("NomFenetre")
            NomLibChamp = "LibElem"
            LibElem = Rs1.Fields(NomLibChamp)
            IndexElem = Rs1.Fields("IndexElem")
            TypeElem = Rs1.Fields("FkIdTypeElem").Value
            If IdLangue = 0 Then Caption = Rs1.Fields("Caption")
            If IdLangue = 1 Then Caption = Rs1.Fields("Caption2nd")
     
        On Error GoTo GestErreurElem
            TraitementOk = False
            Trouve = False
            For i = 0 To Forms.Count - 1
                If Forms(i).Name = NomFenetre Then
                    Set MaFenetre = Forms(i)
                    Trouve = True
                End If
            Next i
     
            If Trouve Then
                 Select Case TypeElem
     
                    Case TypeElem_Command
                        If IndexElem = -1 Then
                            Set MonCommand = MaFenetre.Controls(LibElem)
                        Else
                            Set MonCommand = MaFenetre.Controls(LibElem)(IndexElem)
                        End If
                        MonCommand.Caption = Caption
     
                    Case TypeElem_Label
                        If IndexElem = -1 Then
                            Set MonLabel = MaFenetre.Controls(LibElem)
                        Else
                            Set MonLabel = MaFenetre.Controls(LibElem)(IndexElem)
                        End If
                        MonLabel.Caption = Caption
                End Select
            End If
     
            TraitementOk = True
    GestErreurElem:
            If Not TraitementOk Then
                AjoutLOG TypeLog_Appli, "Traduction Elem" + LibElem + " de " + NomFenetre + " échouée"
            End If
            On Error GoTo 0
            Rs1.MoveNext
        Wend
    L'erreur est remonté que je sois en débeugage ou diretement sur l'exe.

    Merci

    FRED

  2. #2
    Membre émérite Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Par défaut
    Je pense que ta routine de gestion d'erreur n'est pas bonne
    1/ elle ne doit pas être dans le programme (c'est un sous-programme)
    2/ il manque un Resume (voir MSDN)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    While Not Rs1.EOF
     
            NomFenetre = Rs1.Fields("NomFenetre")
            NomLibChamp = "LibElem"
            LibElem = Rs1.Fields(NomLibChamp)
            IndexElem = Rs1.Fields("IndexElem")
            TypeElem = Rs1.Fields("FkIdTypeElem").Value
            If IdLangue = 0 Then Caption = Rs1.Fields("Caption")
            If IdLangue = 1 Then Caption = Rs1.Fields("Caption2nd")
     
        On Error GoTo GestErreurElem
    ' a partir de ce moment , toute erreur appelle le sous programme GestErreurElem:
     
    etc etc etc 
        Wend
     
    exit SUB
    ' ***** sous programme de gestion d'erreur ********
    GestErreurElem:
            AjoutLOG TypeLog_Appli, "Traduction Elem" + LibElem + " de " + NomFenetre + " échouée"
            Rs1.MoveNext
     Resume toto ' étiquette où tu continues ton programme
    End Sub

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 243
    Par défaut
    Citation Envoyé par DAUDET78 Voir le message
    Je pense que ta routine de gestion d'erreur n'est pas bonne
    1/ elle ne doit pas être dans le programme (c'est un sous-programme)
    2/ il manque un Resume (voir MSDN)
    même si ce n'est pas ma manière préférée et de loin :
    1/ pas forcément : ici, elle est utilisée dans le sens : en cas d'erreur, on va directement (ou presque) à la lecture de l'enreg. suivant.
    2/ pas besoin ici : on continue le traitement

    DAUDET78 : ou se situe ta seconde erreur ? ne serait-ce pas entre le "while" et le "on error goto" ?

  4. #4
    Membre émérite Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Par défaut
    Citation Envoyé par 250rgv Voir le message
    1/ pas forcément : ici, elle est utilisée dans le sens : en cas d'erreur, on va directement (ou presque) à la lecture de l'enreg. suivant.
    mais on y passe même si il n'y a pas d'erreur
    2/ pas besoin ici : on continue le traitement
    Une gestion d'erreur sur On Error Goto doit toujours revenir par un Resume
    DAUDET78 : ou se situe ta seconde erreur ? ne serait-ce pas entre le "while" et le "on error goto" ?
    Ce n'est pas moi qui pose la question .... Frto0 a un problème si un autre enregistrement est mauvais . Ce deuxième appel au sous-programme de gestion d'erreur ne se fait pas ... et c'est logique

  5. #5
    Membre émérite
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Par défaut
    Bonjour,

    Remarque personnelle

    Je préfère de loin faire des tests ( if...) pour faire en sorte que le code ne génère pas d'erreur plutôt qu'un on error ou Resume next ... ( qui peut parfois cacher un manque de logique dans la programmation ou une programmation peu rigoureuse)

    Mais... c'est mon avis.

    A+

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 243
    Par défaut
    Citation Envoyé par DAUDET78 Voir le message
    mais on y passe même si il n'y a pas d'erreur
    Oui, car il débranche sur la lecture suivante s'il y a une erreur et s'il n'y en a pas, la lecture suivante doit se faire quand même.

    Citation Envoyé par DAUDET78 Voir le message
    Ce n'est pas moi qui pose la question .... Frto0
    Oui, excuse-moi

    Maintenant, tout comme iclic, je préfère prévoir et traiter des erreurs potentielles avec des ifs de contrôle avant de tomber sur l'erreur et de devoir essayer de rétablir un état stable après coup.

    edit : orthogrraphe

  7. #7
    Membre émérite Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Par défaut
    Voilà un programme testé qui utilise On Error Goto.
    On a 5 TextBox numérotées de 0 à 4 et qui contiennent des nombres positif ou négatif
    On calcule la racine carré de chaque TextBox et, si il y a une erreur, on met le numéro de la TextBox en cause dans un label Resultat.Caption


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Calcul_Click()
    S$ = ""
    For I% = 0 To 4
        J% = Val(Valeur(I%).Text) ' lecture de la valeur
        On Error GoTo ValeurNegative
            K = Sqr(J%)  'erreur si J% est négatif
    Suivant:
    Next I%
    Resultat.Caption = S$ 'affichage des N° de case négative
    Exit Sub
    ' Sous programme de gestion d'erreur
    ValeurNegative:
        S$ = S$ & Format$(I%) & " "
    Resume Suivant
    End Sub

  8. #8
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Par défaut
    Bonjour,

    Merci à vous deux.

    Réalisé une recheche de l'élément dans les éléments de la fenêtre avant d'effectuer la modification du Caption si il est trouvé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    'on recherche le control correspondant
        Trouve = False
        Fin = False: i = 0
        For Each ControlW In MaFenetre.Controls
            If ControlW.Name = LibElem Then
                If IndexElem = -1 Then
                    Trouve = True
                    Set MonControl = ControlW
                Else
                    If ControlW.Index = IndexElem Then
                        Trouve = True
                        Set MonControl = ControlW
                    End If
                End If
            End If
            If Trouve Then Exit For
        Next ControlW
        If Not Trouve Then GoTo FinTraitement
    Cela m'évite de tomber dans le case d'erreur mais ne solutionne pas le problème.

    On passe bien à chaque fois par le label GestErreurElem mais la gestion de l'erreur n'est réalisé que si pas Traitement Ok.
    Cette façon de gérer l'erreur évite de réaliser un Resume qui remonte dans le code (ce que je m'interdis de faire).

    En récap, j'évite de tomber le cas de gestion d'erreur donc je ne gère plus l'erreur 2 fois de suite. Mais le problème reste existant.

    Merci

    FRED

  9. #9
    Membre émérite Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Par défaut
    Citation Envoyé par frto0 Voir le message
    Cette façon de gérer l'erreur évite de réaliser un Resume qui remonte dans le code (ce que je m'interdis de faire).
    Je ne vois pas ton problème psychologique .... permet de sauter la partie du programme qui génère l'erreur et de continuer proprement

    Ou alors, tu n'as rien pigé au fonctionnement du

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 243
    Par défaut
    Citation Envoyé par frto0 Voir le message
    Bonjour,
    En récap, j'évite de tomber le cas de gestion d'erreur donc je ne gère plus l'erreur 2 fois de suite. Mais le problème reste existant.
    Si cela peut te consoler, il m'est arrivé une ou deux fois d'avoir un problème similaire mais à chaque fois, c'était du à mon code

    Citation Envoyé par DAUDET78 Voir le message
    Je ne vois pas ton problème psychologique .... permet de sauter la partie du programme qui génère l'erreur et de continuer proprement...Ou alors, tu n'as rien pigé au fonctionnement du "On Error Goto"
    Tu sais, on peut avoir compris un concept ou une technologie et préférer travailler d'une manière qui évite de l'utiliser.

    Par ailleurs, frto0, que fais-tu si Trouve est vrai ?

    Personnellement, j'éviterais les "goto" et ferais quelque chose du style (c'est peut-être ce que tu fais dans ton "vrai" code, remarque )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        ...
        Trouve = False
        ...
        For Each ControlW In MaFenetre.Controls
        ...
        Next ControlW
        If Trouve Then 
            ' traitement  
        else
            ' écriture dans le log
        end if
        'lecture suivante
        ...
    Ce n'est que mon avis, mais je pense qu'il faut avoir une gestion d'erreur pour traiter les erreurs "inattendues". Les autres - comme par exemple, un nom que tu ne trouve pas - faisant partie de celles qui sont prévisibles, dans l'idéal, le code doit les prévoir/vérifier/traiter sans avoir à passer dans la gestion d'erreur (comme ici avec la variable "Trouve").

  11. #11
    Membre émérite
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Par défaut
    Bonjour,


    essaie pour voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    'on recherche le control correspondant
        Trouve = False
        Fin = False: i = 0
        For Each ControlW In MaFenetre.Controls
            If ControlW.Name = LibElem Then
                If IndexElem = -1 Then
                        Trouve = True
                        Exit For
                                  Else
                        If ControlW.Index = IndexElem Then
                           Trouve = True
                           Exit For
                        End If
                End If
            End If
        Next ControlW
        If Not Trouve Then 
            Gosub FinTraitement
                      Else
            Set MonControl = ControlW
        End If 
     
    exit Sub
     
      FinTraitement:
         ....
         ....
      Return

  12. #12
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Par défaut
    Bonjour,

    Merci à vous pour vos remarques, nous sommes d'acord sur l'ensemble après les principes de programmation (pas de retour arrière) c'est à chacun de voir.

    Ceci dit, j'évite le problème donc plus de blocage dans mon appli mais le pb subsiste : Gestion d'erreur dans une boucle avec plusieurs appel de la gestion d'erreur.

    Merci

    FRED

  13. #13
    Membre émérite Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Par défaut
    Citation Envoyé par DAUDET78 Voir le message
    Voilà un programme testé qui utilise On Error Goto.
    On a 5 TextBox numérotées de 0 à 4 et qui contiennent des nombres positif ou négatif
    On calcule la racine carré de chaque TextBox et, si il y a une erreur, on met le numéro de la TextBox en cause dans un label Resultat.Caption
    Tu as testé avec cette approche de programme et un ????
    Pour moi, je ne pense pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion des erreurs dans une boucle
    Par shimomura22 dans le forum C#
    Réponses: 4
    Dernier message: 17/04/2015, 09h51
  2. Gestion des erreurs dans une boucle While
    Par Gregory.M dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/08/2008, 20h57
  3. Erreur dans une boucle et ne marche pas ?
    Par mitherkiller dans le forum SDL
    Réponses: 8
    Dernier message: 21/04/2007, 14h17
  4. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo