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

  1. #1
    Chroniqueur Actualités

    Homme Profil pro
    CEO
    Inscrit en
    Juillet 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : CEO
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 78
    Points : 1 395
    Points
    1 395
    Par défaut PHP intègre désormais un bloc "Finally", pour une gestion plus propre des sorties d'exceptions
    PHP intègre désormais un bloc "Finally"
    Pour une gestion plus propre des sorties d'exceptions


    Xinchen Hui, développeur du projet PHP, a commité hier l'introduction du mot clé "finally" dans le corps du langage.

    Cette fonctionnalité, à mainte reprise sollicitée par la communauté, vient d'être officiellement intégrée au langage après un vote favorable ce lundi. Sa RFC (demande de commentaires) a reçu 25 oui (dont celui de Rasmus Lerdorf) contre 5 refus.



    finally permet d'éviter au développeur d'écrire un code de nettoyage lorsqu'une exception non manipulable se produit, comme illustré dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $db = mysqli_connect(); 
    try {
       call_some_function($db);
    } catch (Exception $e) {
       mysqli_close($db); 
       throw $e;
    }
    mysqli_close($db);
    L'introduction de finally fournit au développeur une manière plus propre de gérer ce genre de problématiques. Le bloc finally s'exécute toujours lorsqu'on quitte le bloc try. Cela permet d'exécuter le bloc finally même si une exception inattendue se produit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $db = mysqli_connect(); 
    try {
       call_some_function($db); //La fonction peut produire des exceptions sur lequelles on ne peut intervenir anticiper
    } finally {
       mysqli_close($db); 
    }
    Mais c'est aussi utile lorsque le code de nettoyage est contourné de façon accidentelle par un return, un continue ou un break, comme illustré ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
        return 2;
    } finally {
        echo "this will be called\n";
    }
    //this will never be called
    echo "you can not see me";
    Ce code affichera « this will be called ». Le texte après le bloc try/finally ne sera pas affiché.

    On peut envisager des scénarios plus sophistiqués, avec un cas imbriqué :

    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
    function foo ($a) {
       try {
          echo "1";
          try {
            echo "2";
            throw new Exception("ex");
          } catch (Exception $e) {
            echo "3";
          } finally {
            echo "4";
            throw new Exception("ex");
          }
       } catch (Exception $e) {
          echo "3";
       } finally {
          echo "2";
       }
       return 1;
    }
    var_dump(foo("para"));

    Ce commit n'a pas engendré l'annonce (ou le lancement) d'une nouvelle version du langage. Les plus téméraires peuvent compiler la dernière branche du langage à partir de son code source.


    Source : finally sur le wiki de PHP

    Et vous ?

    Que pensez-vous de l'intégration de ce mot clé en PHP ?
    Comment faisiez-vous sans sa présence ?

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Que pensez-vous de l'intégration de ce mot clé en PHP ?
    Je pense que c'est une bonne nouvelle, les développeurs PHP (ou autres ) reprochaient souvent le manque du mot-clé finally.

    Comment faisiez-vous sans sa présence ?
    "Comme tout le monde ?" J'ai envie de dire... en se débrouillant.
    Pour ma part je n'ai pas eu beaucoup l'occasion de rencontrer les problèmes cités en PHP.
    En même temps, comment font ceux qui font du C++ et qui n'ont toujours pas le bloc finally ?
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 11
    Points : 52
    Points
    52
    Par défaut
    Quand il n'y a pas de finally, ben une simple condition.
    Mais bon, en ce qui me concerne je l'ai en C#. Mais c'est une bonne nouvelle de l'avoir en php.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En C++ on fait du RIIA, c'est à dire une classe encapsulant la ressource.

    Le finally est implicite: destruction de toute les variables locales.

    L'équivalent c++ de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cx = createConnection(...)
    try{
        useConnection();
    } finally {
        killConnection()
    }
    est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
    Connection cx(...);
    cx.use();
    }
    Parce que le destructeur de cx sera appelé à la sortie du bloc d'accolade.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    c'est pas mal...mais c'est pas prêt d'arriver sur l'ensemble des hébergeurs et clients
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Points : 31
    Points
    31
    Par défaut c'est bien mais ...
    je trouve aussi que c'est une bonne chose, que les développeurs de différents langages retrouvent leurs habitudes, le souci restant que les fonctions natives de php ne jettent pas nécessairement d'exception lors de problèmes rencontrés (certaines jouent sur la valeur de retour, certaines jettent l'exception).
    tant que ce souci ne sera pas résolu, php sera toujours en retard au niveau des exceptions de mon point de vue.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 218
    Points : 1 088
    Points
    1 088
    Par défaut
    finally...

    (désolé. pas pu m'en empêcher )

  8. #8
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    C'est une belle avancée, mais bien d'accord avec arkadih

    J'ai pas souvenir d'avoir utilisé des exceptions en PHP, faut dire que ça fait un bail que je n'en ai pas fait à un gros niveau.

    En java je ne peux me passer du finally, mais toutes les fonctions jettent des exceptions (erreur de syntaxe sql, erreur de connexion à la BDD...), en PHP il faudra tester les valeurs de retour et déclencher soi-même l'exception.
    Membre éclairé, lol !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 30
    Points
    30
    Par défaut
    Pas sur de la pertinence de la chose en PHP.

    y'a une bonne partie des dev' PHP qui ne savent même pas ce qu'est un try..catch...

  10. #10
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 617
    Points : 188 587
    Points
    188 587
    Par défaut
    Citation Envoyé par moriarti13 Voir le message
    y'a une bonne partie des dev' PHP qui ne savent même pas ce qu'est un try..catch...
    À commencer par le wiki PHP : dans la coloration syntaxique, try et catch ne sont pas reconnus... Pourtant, ce n'est pas si compliqué de mettre à jour une syntaxe pour GeSHi (utilisé par leur DokuWiki) ...

    D'ailleurs, un finally n'est pas toujours la meilleure chose au monde : si on met un return dans les blocs try ou catch, le contenu du finally sera exécuté avant le retour de fonction, c'est-à-dire qu'on ne peut plus suivre simplement le fil d'exécution du code (ça vous rappelle GOTO ?).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 126
    Points : 351
    Points
    351
    Par défaut
    Citation Envoyé par dourouc05 Voir le message
    D'ailleurs, un finally n'est pas toujours la meilleure chose au monde : si on met un return dans les blocs try ou catch, le contenu du finally sera exécuté avant le retour de fonction, c'est-à-dire qu'on ne peut plus suivre simplement le fil d'exécution du code (ça vous rappelle GOTO ?).
    Ouais enfin c'est mettre un return dans un catch qui est sale, pas le finally lui même

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 126
    Points : 351
    Points
    351
    Par défaut
    Citation Envoyé par iubito Voir le message
    En java je ne peux me passer du finally, mais toutes les fonctions jettent des exceptions (erreur de syntaxe sql, erreur de connexion à la BDD...), en PHP il faudra tester les valeurs de retour et déclencher soi-même l'exception.
    Il y a des exceptions généré directement par les méthodes de l'API, comme PDOException pour les erreur sql, mais ouais c'est un peu brouillon et pas forcément uniforme.

  13. #13
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 17
    Points : 59
    Points
    59
    Par défaut
    Je n'ai jamais compris l'intérêt de finally. Comme en a parlé leternel, le RIIA est fait pour ça. Utiliser les exception sans RIIA, c'est un peu un non-sens.

    Ceci dit, PHP est un langage sale, à rustine. Et plutôt que d'avoir une gestion du scope de variables cohérent, un emplâtre finally est rajouté...

  14. #14
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Citation Envoyé par Xinu2010 Voir le message
    Ouais enfin c'est mettre un return dans un catch qui est sale, pas le finally lui même
    Quand tu traites plusieurs exceptions au sein d'une fonction tu peux avoir deux comportements en cas d'erreur :
    • L'erreur n'est pas bloquante ou peut être corrigée => la fonction se poursuie
    • L'erreur est innacceptable => return avec un code d'erreur

    Je ne vois absolument pas en quoi c'est donc une façon sale de coder...
    Tu préferrai utiliser du throw à plus savoir quoi en faire et tout gérer toutes les exceptions dans ton point d'entrée ? Cela résoud pas tous les problèmes, ça complique même beaucoup pour certains traitements...

    Edit pour en dessous et expliciter mon message :
    Citation Envoyé par gl
    [1] si on laisse de côté la cas particulier du code à la frontière entre un module avec exception et un qui ne les gère pas et le code historique bien entendu.
    C'est au contraire dans cette optique que je répondais. Comme un autre posteur l'a dit il me semble plus haut les développeurs PHP ne sont pas friands des exceptions et donc quand on développe un module il est préferrable de renvoyer des codes de retours que des exceptions quand on développe des modules.
    Personnelement je préfère d'autant plus les codes de retours que c'est la philosophie des OS unix et codes que j'utilise dans mon travail (je suis pas dev web, je n'en fais qu'à mes heures perdues les weekends).

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par transgohan Voir le message
    L'erreur est innacceptable => return avec un code d'erreur
    Si tu ne sais pas quoi faire de l'exception à cet endroit et que tu cherches juste à la faire remonter dans les couches supérieures, pourquoi la catcher et la convertir en code de retour [1] ? Pourquoi ne pas laisser le mécanisme d'exception propager l'erreur jusqu'à une couche qui est capable d'en faire quelque-chose ? c'est bien là le rôle des exceptions.


    [1] si on laisse de côté la cas particulier du code à la frontière entre un module avec exception et un qui ne les gère pas et le code historique bien entendu.

  16. #16
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Citation Envoyé par Lupus Michaelis Voir le message
    Je n'ai jamais compris l'intérêt de finally. Comme en a parlé leternel, le RIIA est fait pour ça. Utiliser les exception sans RIIA, c'est un peu un non-sens.

    Ceci dit, PHP est un langage sale, à rustine. Et plutôt que d'avoir une gestion du scope de variables cohérent, un emplâtre finally est rajouté...
    Il y a des langages, comme le java, où le destructeur est appelé "plus tard", et oui il n'est pas vraiment possible de le définir.
    Du coup, le RIIA y est totalement irréalisable.
    Bien plus que l'absence d'héritage multiple, c'est ca qui m'énerve le plus en Java...
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par leternel Voir le message
    Il y a des langages, comme le java, où le destructeur est appelé "plus tard", et oui il n'est pas vraiment possible de le définir.
    Du coup, le RIIA y est totalement irréalisable.
    Bien plus que l'absence d'héritage multiple, c'est ca qui m'énerve le plus en Java...
    Java7 introduit le try-with-resource qui couvre partiellement le scope du RAII.
    Idem en C# avec le using dont l'utilisation me semble plus large que le try-with-resource.

    La différence entre ces mécanismes et le RAII tel que présent en C++ est que le choix d'utiliser ou non ce mécanisme est fait à l'acquisition de la ressource alors qu'en C++ il est fait dans le design de la classe.

  18. #18
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    J'oubliais ces subtilités, parce que, pour mon plus grand plaisir, je suis actuellement sur un projet développé en java 1.4, sur une JVM personalisé, et que je pleure assez régulièrement de devoir écrire toute les cochoncetés que Java 5 avait supprimé.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 71
    Points : 39
    Points
    39
    Par défaut
    Dans quelle version de PHP, le bloc finally sera incorporé ?
    Dans la dernière version en date (PHP 5.4.6), ce bloc n'est toujours pas accepté.
    Avez-vous une idée de sa sortie ?

  20. #20
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Ce commit n'a pas engendré l'annonce (ou le lancement) d'une nouvelle version du langage. Les plus téméraires peuvent compiler la dernière branche du langage à partir de son code source.
    Bref Wait & See ou recompiles toi une version en l'incluant.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

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