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

WinDev Discussion :

Propagation des erreurs [WD23]


Sujet :

WinDev

  1. #1
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut Propagation des erreurs
    Bonjour,

    J'essaye de remonter proprement une erreur au moyen de ErreurPropage() sur deux niveaux :

    (un peu d'indulgence ... je m'essaie a la POO sous WD ...)

    Soit une classe parente
    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
     
     
    MHFSQL est une Classe
     
    FIN
     
    PROCÉDURE HF_Supprimer(sFichier, sX_ID, nID)
     
    bOK est un booléen
     
    	HLitRecherchePremier(sFichier,sX_ID,nID)
     
     
    SI HTrouve() ALORS 
    	SI  HSupprime(Clients) ALORS 
    		bOK =  Vrai  
    	SINON 
    		bOK = Faux 
    	FIN
    SINON 
     
    	bOK = Faux
    FIN
     
    RENVOYER bOK
     
    CAS EXCEPTION:
    	ExceptionPropage(ExceptionInfo())
    	RENVOYER Faux 
    CAS ERREUR:
    	ErreurPropage(ErreurInfo())
    	RENVOYER Faux


    Une classe fille :

    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
     
    MClientsest une Classe <MAPPING=Clients>
     
    	// Le code se trouvant entre <MAPPING> et <FIN> est généré automatiquement.
    	// Il sera effacé et recréé entièrement à chaque génération depuis l'analyse.
    	<MAPPING>
     
    	<FIN>
     
    PROCÉDURE Supprimer()
     
    SI PAS  Ancêtre:HF_Supprimer("Clients","C_ID", :m_nC_ID) ALORS
    	RENVOYER Faux 
    SINON 
    	RENVOYER Vrai 
    FIN
     
    FIN

    Comment faire dans ma classe fille , pour remonter proprement les erreur dans la fenêtre appelante ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SI PAS gclClient.Supprimer() ALORS 
    	DO something ...
    SINON 
    	ChargerListeClients()
    FIN
    #

  2. #2
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 267
    Points
    5 267
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Dans un premier temps je e vois pas pourquoi tu écris que tu est débutant en POO, la propagation des erreurs n'a rien à voir avec la POO.
    Dans un deuxième temps, ton CAS ERREUR/CAS EXCEPTION est shunté dans la plupart des cas. cf doc, je cite :
    Remarques :
    Le code de gestion de l'erreur présent dans le traitement en cours est prioritaire sur les traitements automatiques dans les deux cas suivants :
    Test d'une fonction de type "SI PAS xxxx = Vrai ou Faux"
    Test des erreurs avec la variable ErreurDétectée.
    Ton code deviens alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    FONCTION HF_Supprimer(sFichier, sX_ID, nID) :booléen
     
    HLitRecherchePremier(sFichier,sX_ID,nID)   //Erreur traitée dans CAS ERREUR
    HSupprime(Clients) //Erreur traitée dans CAS ERREUR
     
    RENVOYER Vrai
     
    CAS EXCEPTION:
    	ExceptionPropage(ExceptionInfo())
    	RENVOYER Faux 
    CAS ERREUR:
    	ErreurPropage(ErreurInfo())
    	RENVOYER Faux
    Si tu veux traiter plus finement tes erreurs/exceptions il faut passer par ErreurDéclenche/ExceptionDéclenche e.g. :
    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
     
    FONCTION HF_Supprimer(sFichier, sX_ID, nID):booléen
     
    HLitRecherchePremier(sFichier,sX_ID,nID)
     
    SI HTrouve() ALORS
    	SI  HSupprime(Clients) ALORS 
    		RENVOYER Vrai 
    	SINON 
    		ErreurDéclenche(2,"Suppression impossible")
    	FIN
    SINON 
           ErreurDéclenche(1,"Client non trouvé")
    FIN
     
    CAS EXCEPTION:
    	ExceptionPropage(ExceptionInfo())
    	RENVOYER Faux 
    CAS ERREUR:
    	ErreurPropage(ErreurInfo())
    	RENVOYER Faux
    Revenons à l'utilisation de ErreurPropage. La propagation se fait vers le niveau n-1 (i.e. le niveau qui a directement appelé la fonction,) dans ton cas la méthode Supprime.
    Si tu veux que la propagation se fasse dans le code qui appelle Supprimer, il faut activer la propagation dans Supprimer. e.g.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FONCTION Supprimer():booléen
    Ancêtre:HF_Supprimer("Clients","C_ID", :m_nC_ID)
    RENVOYER Vrai
     
    CAS EXCEPTION:
    	ExceptionPropage(ExceptionInfo())
    	RENVOYER Faux 
    CAS ERREUR:
    	ErreurPropage(ErreurInfo())
    	RENVOYER Faux
    L'appel de Supprimer se fait alors de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SI PAS gclClient.Supprimer() ALORS 
    	ErreurDéclenche(ErreurInfo(errCode),ErreurInfo(errMessage)
    SINON 
    	ChargerListeClients()
    FIN
    CAS ERREUR 
         Erreur(ErreurInfo())
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  3. #3
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Dans un premier temps je e vois pas pourquoi tu écris que tu est débutant en POO, la propagation des erreurs n'a rien à voir avec la POO.
    C'était plus par rapport au code (spaghetti ...) des classes, c'est pour des tests didactiques

    Après lecture et mise en application de tes exemples c'est nettement plus élégant et fonctionnel !

    J'ai juste un truc que je trouve bizarre :

    quand je crée une erreur au niveau de la suppression :

    - si je mets le code avec ErreurDeclenche(mon code d'erreur), le CAS ERREUR n'est pas exécuté.
    - si je le remplace ErreurDeclenche() par Erreur( mon code d'erreur) , j'ai bien l'erreur "Client non trouvé", mais affiché 2 deux fois

    ---------------------------
    Clients liste
    ---------------------------
    1

    Client non trouvé

    Client non trouvé
    ---------------------------
    OK
    ---------------------------


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    gclClient = TABLE_REQ_Clients_Liste
    SI OuiNon(Non,"Supprimer le client " + gclClient.m_sC_Nom + " ?") = Non ALORS 
    	RETOUR
    FIN
    SI PAS gclClient.Supprimer() ALORS 
    	ErreurDéclenche(ErreurInfo(errCode),ErreurInfo(errMessage)) 
    SINON 
    	ChargerListeClients()
    FIN
     
     
    CAS ERREUR:
        Erreur(ErreurInfo())

    Merci pour ton aide

  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 267
    Points
    5 267
    Billets dans le blog
    1
    Par défaut
    Au temps pour moi. J'avais repris ton squelette de code sans réfléchir. Le fait de tester le résultat shunte le traitement automatique, comme je l'avais signalé dans ma deuxième remarque.
    Si gclClient.Supprimer() renvoie Faux, c'est qu'une erreur a été détectée en amont donc on "saute" vers le CAS ERREUR/CAS EXCEPTION
    Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gclClient.Supprimer()//Si faux, il y a une erreur/exception et ChargeListeClients n'est pas exécuté
    ChargerListeClients()
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  5. #5
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Avec ton dernier message, c'est parfait, un grand merci à toi.

    Et je viens de comprendre mes doubles messages d'erreur :

    Selon la doc:

    ExceptionPropage([<Message>])
    <Message> : Chaîne de caractères optionnelle pouvant être ajouté à l'erreur.

    En mettant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ExceptionPropage(ExceptionInfo())
    Je rajoutais le message d'erreur ... au message d'erreur :-) , sur trois niveaux avec l'héritage, je me retrouvais avec 3 x le message concaténé

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

Discussions similaires

  1. Propagation des erreurs
    Par loustalet dans le forum PL/SQL
    Réponses: 7
    Dernier message: 15/03/2013, 19h59
  2. [Eclipse 3.0]Affichage des erreurs
    Par alfsalim dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/07/2004, 17h33
  3. Réponses: 8
    Dernier message: 18/05/2004, 10h03
  4. [XSLT]Est ce qu'il y'a la gestion des erreur en xslt ?
    Par miloud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/02/2004, 17h19
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

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