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

VBA Access Discussion :

Gestion des erreurs : systématiser GOTO 0 dans un handle de sortie? [Toutes versions]


Sujet :

VBA Access

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut Gestion des erreurs : systématiser GOTO 0 dans un handle de sortie?
    Bienvenue chez moi,

    J'implémente toujours dans mon code, la gestion des erreurs. Alors pour éviter la gestion de l'ouverture d'un Objet, peut-on dans Exit_: systématiser set oObjI = nothing en désactivant les messages d'erreur de programmation par :


    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
    function fFunctionName ()
    On Error goto Err_
     
         [déclaration...]
         [Code...]
     
    Exit_:
          Application.AffichageMessagesAlerte = Faux (???)
          On Error Goto 0 (???)
          set oObjI = nothing
          set oObjN = nothing
     
          Exit Function 
    Err_:
          msgbox err.code & " : " &  Err.Description.
          Resume Exit
     
    End fFunction
    Si cela n’enfreint pas les conventions de codage, quelle est la meilleur solution
    GOTO 0
    ou
    Application.AffichageMessagesAlerte = Faux

    Voilà, merci pour votre aide et n'oubliez pas : Bonjour chez vous

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 580
    Points
    24 580
    Par défaut
    Bonjour,

    AffichageMessagesAlerte est valable pour toute l'application.
    On error goto 0 ne traite plus les erreurs qui se produisent après la ligne.

    A noter que la première ne se met qu'une fois au démarrage de l'application alors que la seconde doit être répétée pour chaque procédure ou fonction souhaitée.

    Cordialement,

  3. #3
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    A toutes fins utiles, voici la gestion d'erreur qui me donne entière satisfaction :
    Exemple de procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub adrs_DblClick(Cancel As Integer)
    If Not Mode_debug Then On Error GoTo err:
    100 If D_ha > 1 Or D_log > 1 Then
    102   ppal = adrs
    104   Me.Refresh
        End If
        Exit Sub
    err: Call message("Erreur " & err.Number & "/" & Erl & " dans sdf.adrs_DblClick : " & err.description)
    End Sub
    "sdf" est le nom de la form
    Mode_debug est vrai en développement, faux en exploitation

    Procédure globale qui écrit l'erreur dans le journal de bord (table "messages") :
    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
    Public Sub message(T, Optional visu = True)
    If Not Mode_debug Then On Error GoTo err:
    100 DoCmd.Hourglass False
    101 If Not IsNull(T) Then
    102   If visu Then MsgBox T, vbExclamation, ""
    103   If err.Number = 424 Then Exit Sub 'pas de msg si l'utilisateur a fermé excel ("objet requis")
    108   Sr = "INSERT INTO messages (qui,quand,version,quoi) VALUES ('" _
          & Nz(User_init, "X") & "','" & Now & "','" & Vf & "','" & Apo2(Nz(T, "")) & "');"
    110   CurrentDb.Execute Sr, dbFailOnError
        End If
        Exit Sub
    err:
    120 MsgBox "Enregistrement du message d'erreur impossible(" & Erl & ") : " & vbCr & "'" & Nz(User_init, "X") _
        & "','" & Now & "','" & Vf & "','" & Apo2(Nz(T, "")) & "'", , "Erreur"
    End Sub
    Seul inconvénient : il faut numéroter les lignes

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Bonjour à tous,

    Merci loufab et nico84 pour vos retours.

    L'explication d'un problème est toujours un exercice difficile alors et je pense ne pas avoir réussi correctement à le poser.

    Ma question porte uniquement sur la gestion des objets qui peuvent :

    • voir été correctement instanciés
    • Ou pas dans le cas d'une erreur intervenue avant leur instanciation



    Et la systématisation de l'OPÉRATION OBLIGATOIRE de fermeture des objets, en évitant :

    • La vérification de leur instanciation
    • La génération d'un message d'erreur suite à leur fermeture alors qu'ils n'ont pas été instanciés, information non pertinente puisque s'ils n'ont pas été instanciés c'est qu'une erreur est intervenue antérieurement et donc déjà traitée!


    D'où l'appel à SET oObj = Nothing dans un handle de sortie TOUJOURS APPELÉ avec GOTO 0 pour ne jamais traiter le message d'erreur de tentative de traitement d'un objet non instancié, message d'erreur non pertinent car est en fin de routine/fonction.

    Voilà et n'oubliez pas: Bonjour chez vous

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 580
    Points
    24 580
    Par défaut
    Si tu déclares tes variables objets au plus haut de ta procédure/fonction le set nothing ne provoquera pas d'erreur.

    Mettre un Goto 0 permet de prévenir ce cas de figure lors d'une réinitialisation ; effet délétère souvent constaté au déclenchement d'une erreur.

    Maintenant faire un nothing sur une variable objet non instanciée mais déclarée ne pose aucun problème, si c'est la question que tu te poses.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    loufab, merci pour tes précieux retours et c'est exactement ma question.

    Et pour ne pas provoquer d'erreur si un SET est appliqué sur un objet non instancié, il faut OBLIGATOIREMENT DÉCLARER EXPLICITEMENT L'OBJET.

    Encore merci loufab

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 580
    Points
    24 580
    Par défaut
    Il faut toujours créer tes modules avec Option Explicit dans l'en-tête ainsi lors de la compilation VBE indiquera que la variable utilisée n'est pas déclaré.

    cf réglage VBE/outils/options/editeur/Déclaration des variables obligatoires.

    Tu confonds déclaration (dim) et instanciation (set).

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Bonjour oufab

    Ma dernière question fait suite à ta phrase
    Maintenant faire un nothing sur une variable objet non instanciée mais déclarée ne pose aucun problème,
    je comprend qu'il n'y aura pas d'erreur générée par l'instruction set oObjet = nothing même si la variable objet n'a jamais instanciée mais par contre déclarée?

    Pour essayer d'être parfaitement clair, imaginons le code suivant:
    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
     
    Private Sub Display(pPath as string)
     
    On Error GoTo Err_
     
        Dim oWkSpace As DAO.Workspace
        Dim oDb As DAO.Database
        Dim oRecSet As DAO.Recordset
        Dim oField As DAO.Field
        Dim oChart As ChartObject
     
     
        Dim oXLApp As Excel.Application
        Dim oXLWbk As Excel.Workbook
        Dim oXLSht As Excel.Worksheet
     
         code provoquant une erreur => Execution de Err_: ==> Non instanciation de oXLApp & oXLWbk ....
     
        Set oXLApp = CreateObject("Excel.Application")
        Set oXLWbk = oXLApp.Workbooks.Open(pPath )
     
         code suite....
     
    Exit_:
     
        Set oXLWbk = Nothing
        Set oXLApp = Nothing
     
        oRecSet.Close
        Set oRecSet = Nothing
     
        Exit Sub
     
    Err_:
        MsgBox Err.Description
        Resume Exit_
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exit_:
     
        Set oXLWbk = Nothing
        Set oXLApp = Nothing
    ne provoquera jamais d'erreur même si le code avant l'instanciation de l'objet a provoqué une erreur et que je fait un SET oObjet = nothing dans Exit_?

    Merci pour tes explications

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 580
    Points
    24 580
    Par défaut
    C'est bien ce que j'ai dit. Il n'y a pas de double sens ni de sens caché.

    Attention tu confonds encore instancier (set) et déclarer (dim).

    ça par contre ça va provoquer une erreur si tu n'as pas d'instance puisque c'est une méthode.

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Bonjour loufab

    Ok pour le SET mais maintenant pour la méthode CLOSE, l'utilisation du GOTO 0 n'est-elle pas une solution pour éviter le test de l'instanciation de l'objet sachant qu'en fin de routine/fonction il faut appliquer la méthode CLOSE?

    Merci pour ton avis

    Et n'oubliez pas , bonjour chez vous

  11. #11
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 580
    Points
    24 580
    Par défaut
    Le goto 0 est à placer en dernière extrémité sur des instructions qui peuvent échouées sans toutefois mettre en péril la poursuite du programme.

    Un close peut en faire parti. C'est au développeur d'analyser au cas par cas si c'est judicieux de le faire.

    Est-il judicieux de faire un test d'instanciation avant de faire un close ?

    Possible mais à la discrétion du développeur. La seule question à se poser c'est :
    Qu'adviendra-t-il si je fais un nothing sans faire un close auparavant ?

    La non libération de l'objet et par extension de possibles fuites mémoire.
    Le nothing supprime le pointeur vers l'objet en mémoire mais en aucune façon n'intervient dans la vie de l'objet. (cf objptr())

    Exemple :
    Fait un nothing sur un objet en automation. L'objet reste en mémoire, mais vba n'a plus de lien vers celui-ci.
    Idem sur certains type de recordset : l'application peut ne pas se fermer ou encore rester en mémoire ! Maudit ACCESS ?! non mauvais développeur.

    Petit exemple :
    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
    Function dummy()
    on error goto errSub
    Dim obj As object
    Set obj = .....
    '...
     
    If Not (obj Is Nothing) Then
       obj.Close/quit....
    Else
       'traitement...
    End If
     
    Set obj = Nothing
    ...
    End Function
    ou :

    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
    Function dummy()
    on error goto errSub
    Dim obj As object
    Set obj = ....
    '...
     
    on error goto 0
    obj.Close/quit...
     
    on error goto errSub
    Set obj = Nothing
    exit function
     
    errSub:
    msgbox "erreur"
     
    End Function
    Espérant avoir été clair.

    Cordialement,

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Bonjour Loufab

    beaucoup pour toutes tes explications qui répondent exactement à mes interrogations de néophyte

    Quant à toi Loufab , une préco entre et test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not (obj Is Nothing) Then
    si ce code est placé en fin de programme ou tu restes sur le libre arbitre du développeur ... car nous ne sommes pas des numéros.


    Une dernière question suite à l'évocation du
    .close/quit
    , aurais-tu un petit truc pour savoir
    quand appeler à bon escient .close ou.quit genre par rapport au type de l'objet ou faut-il savoir les objets sur lesquels il faut appliquer tantôt .close tantôt .quit

    Encore une fois merci pour toutes ces informations


    Cordialement

    Et n'oubliez pas: Bonjour chez vous

  13. #13
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 580
    Points
    24 580
    Par défaut
    Concernant le choix entre goto et is nothing c'est justement ce dont je te parlais dans le mail précédent. Le dev doit être à même de savoir lequel doit être employé.

    Quant à Quit/close c'est suivant la classe que tu utilises, ce n'est absolument pas normalisé. A noter que certaines n'en ont tout simplement pas et à juste raison.

    Dans le cas d'une classe personnelle tu pourras très bien utiliser un autre nom de méthode de libération, obj.arret() par exemple ou obj.stop(), obj.turlututu().

    Cordialement,

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Bonsoir Loufab,

    Une nouvelle fois merci pour tes précieuses réponses qui me permettent de passer ce post en résolu.

    Cordialement


    Et n'oubliez pas : Bonjour chez vous

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/11/2013, 07h34
  2. [VBA-E] Dysfonctionnement dans la gestion des erreurs
    Par Choco49 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/06/2006, 11h44
  3. Réponses: 6
    Dernier message: 09/06/2006, 12h17
  4. Gestion des erreurs dans un TRIGGER
    Par SDU64 dans le forum DB2
    Réponses: 1
    Dernier message: 18/05/2006, 09h51
  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