none
Gestion d'erreurs, où est l'erreur ? RRS feed

  • Question

  • Bonjour,

    Y a un truc que je ne comprends pas là, je fais dans une procédure une double gestion d'erreur avec RAB de cette dernière entre les deux et pourtant ça plante ? Voici le code, sans risque, il lit juste des fichiers n'existant pas (de plus), donc vous pouvez copier coller pour tester... Je vais contourner en enfermant dans des procédures individuelles chaque appel, mais bon, y'a quelque chose que je ne comprend pas, d'autant que la RAB de l'erreur s'effectue bien ??? Voici :

    Sub Command1_Click()
     Dim p2010 As Long
     Dim p2011 As Long
     Dim debuteAn As Long
     ChDrive App.Path
     ChDir App.Path
     p2011 = FreeFile
     On Error GoTo erreur2010
     Open "mp1101.txt" For Input As p2011
     Close p2011
     GoTo suite
    erreur2010:
     Close p2011
     MsgBox "Avant resume" & vbLf & Err ' 53
     On Error Resume Next
     p2010 = FreeFile
     On Error GoTo erreur2009
     MsgBox "Avant open" & vbLf & Err 'revient bien à 0
     Open "mp1001.txt" For Input As p2010
     ' 53 PLANTE devraut aller à  :erreur2009 ???
     Close p2010
     debuteAn = 2011
     GoTo debuteEcrit
    erreur2009:
     MsgBox "adr: erreur2009" & vbLf & Err
     Close p2010
     On Error Resume Next
     debuteAn = 2010 ' nouveau logiciel de 2010 à 2020
    debuteEcrit:
     MsgBox "adr: débutEcrit"
    suite:
     MsgBox "adr: suite"
    End Sub
    

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    jeudi 7 octobre 2010 09:29

Réponses

  • Hello,

    contrairement à une idée reçue, la gestion des erreurs en VB avec On Error ... et Resume ... est très complète, mais peut se révéler un peu délicate à bien utiliser. Il faut lire très attentivement la doc et bien en saisir chaque mot pour bien comprendre, quand on se lance dans des trucs compliqués.

    Bon pour faire simple, l'erreur ici est ton premier On Error Resume Next. Tu CROIS avoir "résumé" ton erreur, mais ce n'est PAS le cas. Donc tu es toujours dans le contexte d'une erreur handling. Et le fait qu'ensuite tu fasses un "On error goto erreur2009 n'y change strictement rien. Lorsque la deuxième erreur se produit, elle se produit dans le cadre du premier erreur handling. Et la doc dit bien que dans ce cas, les erreurs ne sont plus trappées : c'est une erreur dans l'erreur. Il est OBLIGATOIRE de sortir du controle d'erreur par un Resume Explicite.

    Si tu veux faire marcher ton bout de code, tu dois écrire comme ceci :

    Sub Command1_Click()
    
    Dim p2010 As Long
    
    Dim p2011 As Long
    
    Dim debuteAn As Long
    
    
    
     ChDrive App.Path
    
     ChDir App.Path
    
     
    
     p2011 = FreeFile
    
     On Error GoTo erreur2010
    
     
    
     Open "mp1101.txt" For Input As p2011
    
     Close p2011
    
     
    
     GoTo suite
    
    
    
    erreur2010:
    
     Close p2011
    
     MsgBox "Avant resume" & vbLf & Err ' 53
    
     Resume suite_1
    
     
    
    suite_1:
    
     p2010 = FreeFile
    
     On Error GoTo erreur2009
    
     
    
     MsgBox "Avant open" & vbLf & Err 'revient bien à 0
    
     Open "mp1001.txt" For Input As p2010
    
     ' 53 PLANTE devraut aller à :erreur2009 ???
    
     Close p2010
    
    
    
    suite_2:
    
     debuteAn = 2011
    
     GoTo debuteEcrit
    
    
    
    erreur2009:
    
     MsgBox "adr: erreur2009" & vbLf & Err
    
     Close p2010
    
     Resume suite_2:
    
     
    
     debuteAn = 2010 ' nouveau logiciel de 2010 à 2020
    
     
    
    debuteEcrit:
    
     MsgBox "adr: débutEcrit"
    
    suite:
    
     MsgBox "adr: suite"
    
    End Sub
    

    Bon il est évident qu'il ne faut PAS faire comme ça, c'est immonde à lire.

    Il faut utiliser une focntion du gengre FichierExiste() (cf. FAQ : http://faq.vb.free.fr/index.php?question=29) et appeler proprement et en séquence ...

     

    Cordialement,


    Jean-marc
    • Marqué comme réponse EhJoe jeudi 7 octobre 2010 15:01
    jeudi 7 octobre 2010 12:00

Toutes les réponses

  • Hello,

    contrairement à une idée reçue, la gestion des erreurs en VB avec On Error ... et Resume ... est très complète, mais peut se révéler un peu délicate à bien utiliser. Il faut lire très attentivement la doc et bien en saisir chaque mot pour bien comprendre, quand on se lance dans des trucs compliqués.

    Bon pour faire simple, l'erreur ici est ton premier On Error Resume Next. Tu CROIS avoir "résumé" ton erreur, mais ce n'est PAS le cas. Donc tu es toujours dans le contexte d'une erreur handling. Et le fait qu'ensuite tu fasses un "On error goto erreur2009 n'y change strictement rien. Lorsque la deuxième erreur se produit, elle se produit dans le cadre du premier erreur handling. Et la doc dit bien que dans ce cas, les erreurs ne sont plus trappées : c'est une erreur dans l'erreur. Il est OBLIGATOIRE de sortir du controle d'erreur par un Resume Explicite.

    Si tu veux faire marcher ton bout de code, tu dois écrire comme ceci :

    Sub Command1_Click()
    
    Dim p2010 As Long
    
    Dim p2011 As Long
    
    Dim debuteAn As Long
    
    
    
     ChDrive App.Path
    
     ChDir App.Path
    
     
    
     p2011 = FreeFile
    
     On Error GoTo erreur2010
    
     
    
     Open "mp1101.txt" For Input As p2011
    
     Close p2011
    
     
    
     GoTo suite
    
    
    
    erreur2010:
    
     Close p2011
    
     MsgBox "Avant resume" & vbLf & Err ' 53
    
     Resume suite_1
    
     
    
    suite_1:
    
     p2010 = FreeFile
    
     On Error GoTo erreur2009
    
     
    
     MsgBox "Avant open" & vbLf & Err 'revient bien à 0
    
     Open "mp1001.txt" For Input As p2010
    
     ' 53 PLANTE devraut aller à :erreur2009 ???
    
     Close p2010
    
    
    
    suite_2:
    
     debuteAn = 2011
    
     GoTo debuteEcrit
    
    
    
    erreur2009:
    
     MsgBox "adr: erreur2009" & vbLf & Err
    
     Close p2010
    
     Resume suite_2:
    
     
    
     debuteAn = 2010 ' nouveau logiciel de 2010 à 2020
    
     
    
    debuteEcrit:
    
     MsgBox "adr: débutEcrit"
    
    suite:
    
     MsgBox "adr: suite"
    
    End Sub
    

    Bon il est évident qu'il ne faut PAS faire comme ça, c'est immonde à lire.

    Il faut utiliser une focntion du gengre FichierExiste() (cf. FAQ : http://faq.vb.free.fr/index.php?question=29) et appeler proprement et en séquence ...

     

    Cordialement,


    Jean-marc
    • Marqué comme réponse EhJoe jeudi 7 octobre 2010 15:01
    jeudi 7 octobre 2010 12:00
  • Jean-Marc, merci ...

    Immonde ... immonde, ben au moins c'est en séquence, et si on utilise le bouton </> et qu'on indique (code vbNet) c'est déjà beaucoup mieux :o)

    Sub Command1_Click()
     Dim p2010 As Long
     Dim p2011 As Long
     Dim debuteAn As Long
     ChDrive App.Path
     ChDir App.Path
     p2011 = FreeFile
     On Error GoTo erreur2010
     Open "mp1101.txt" For Input As p2011
     Close p2011
     GoTo suite
    erreur2010:
     Close p2011
     Resume suite_1
    suite_1:
     p2010 = FreeFile
     On Error GoTo erreur2009
     Open "mp1001.txt" For Input As p2010
     Close p2010
     debuteAn = 2011
     GoTo debuteEcrit
    erreur2009:
     Close p2010
     Resume suite_2:
    suite_2:
     debuteAn = 2010
    debuteEcrit:
    End Sub
    

    En fait, pour résumer, il ne fallait pas mettre "on error resume next" mais "resume adresse", dit comme ça c'est plus court ...

    Mais ... erreur à l'intérieur de l'erreur ... Pourtant j'ai testé l'erreur qui valait "0" à la sortie de la première erreur, je l'ai remis à "0", alors d'où elle tient cette erreur de conserver son ancienne erreur et de me la refourguer alors que je lui dit de se mettre à 0 et que ça affiche 0, hein ? Mystère ...

    Bon, bref, t'ennuies pas à répondre, c'est bon, chat marche comme dit mon chat ... je présume ;o)

    Rajout : Ehhhh, t'approches de la seconde médaille, presque 500, y a plus que toi qui répond en ce moment ...

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Modifié EhJoe jeudi 7 octobre 2010 14:59 Rajout
    jeudi 7 octobre 2010 14:57