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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 639
    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
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 639
    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
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 639
    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

+ 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