Précédent   Forum du club des développeurs et IT Pro > Le club des professionnels en informatique > Actualités
Actualités L'actualité des sociétés du secteur informatique
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 16/08/2012, 13h41   #1
tarikbenmerar
Chroniqueur Actualités
 
Homme Tarik Zakaria Benmerar
CEO
Inscription : juillet 2012
Messages : 78
Détails du profil
Informations personnelles :
Nom : Homme Tarik Zakaria Benmerar
Localisation : Algérie

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

Informations forums :
Inscription : juillet 2012
Messages : 78
Points : 1 361
Points : 1 361
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 :
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 :
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 :
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 :
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 ?
tarikbenmerar est déconnecté   Envoyer un message privé Réponse avec citation 90
Vieux 16/08/2012, 14h29   #2
Gugelhupf
Membre éclairé
 
Homme
Développeur informatique
Inscription : décembre 2011
Messages : 237
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2011
Messages : 237
Points : 335
Points : 335
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 ?
Gugelhupf est déconnecté   Envoyer un message privé Réponse avec citation 21
Vieux 16/08/2012, 14h35   #3
ProgrammeurDotNet
Membre du Club
 
Homme
Inscription : mai 2012
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mai 2012
Messages : 11
Points : 48
Points : 48
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.
ProgrammeurDotNet est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 16/08/2012, 14h41   #4
leternel
Membre Expert
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 182
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 182
Points : 2 496
Points : 2 496
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 :
1
2
3
4
5
6
cx = createConnection(...)
try{
    useConnection();
} finally {
    killConnection()
}
est:
Code :
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.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est actuellement connecté   Envoyer un message privé Réponse avec citation 41
Vieux 16/08/2012, 14h49   #5
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 401
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 401
Points : 10 750
Points : 10 750
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
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/08/2012, 15h15   #6
arkadih
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 13
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : septembre 2008
Messages : 13
Points : 27
Points : 27
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.
arkadih est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 16/08/2012, 15h23   #7
Guilp
Membre émérite
 
Homme
Développeur informatique
Inscription : octobre 2008
Messages : 175
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 : 175
Points : 958
Points : 958
finally...

(désolé. pas pu m'en empêcher )
Guilp est déconnecté   Envoyer un message privé Réponse avec citation 101
Vieux 16/08/2012, 16h34   #8
iubito
Membre éclairé
 
Avatar de iubito
 
Homme Sylvain Machefert
Développeur Java
Inscription : janvier 2003
Messages : 380
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Machefert
Âge : 30
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Développeur Java
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 380
Points : 321
Points : 321
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.
__________________
Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/08/2012, 17h05   #9
moriarti13
Nouveau Membre du Club
 
Inscription : juillet 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 22
Points : 32
Points : 32
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...
moriarti13 est déconnecté   Envoyer un message privé Réponse avec citation 24
Vieux 16/08/2012, 17h43   #10
dourouc05
Responsable Qt & Web sémantique

 
Avatar de dourouc05
 
Homme Thibaut Cuvelier
Étudiant
Inscription : août 2008
Messages : 18 577
Détails du profil
Informations personnelles :
Nom : Homme Thibaut Cuvelier
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 18 577
Points : 74 137
Points : 74 137
Envoyer un message via MSN à dourouc05 Envoyer un message via Yahoo à dourouc05
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 ou PyQt/PySide (tutoriels, FAQ, traductions, sources) ? Contactez-moi par MP.

Pas de question d'ordre technique par MP !
dourouc05 est déconnecté   Envoyer un message privé Réponse avec citation 22
Vieux 16/08/2012, 18h25   #11
Xinu2010
Membre actif
 
Inscription : décembre 2010
Messages : 89
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 89
Points : 174
Points : 174
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
Xinu2010 est déconnecté   Envoyer un message privé Réponse avec citation 72
Vieux 16/08/2012, 18h32   #12
Xinu2010
Membre actif
 
Inscription : décembre 2010
Messages : 89
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 89
Points : 174
Points : 174
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.
Xinu2010 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/08/2012, 06h07   #13
Lupus Michaelis
Membre du Club
 
Homme Mickaël Wolff
Développeur informatique
Inscription : juin 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Mickaël Wolff
Localisation : France, Haut Rhin (Alsace)

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

Informations forums :
Inscription : juin 2012
Messages : 11
Points : 49
Points : 49
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é...
Lupus Michaelis est déconnecté   Envoyer un message privé Réponse avec citation 13
Vieux 17/08/2012, 09h03   #14
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 293
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

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

Informations forums :
Inscription : janvier 2011
Messages : 1 293
Points : 2 848
Points : 2 848
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.
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 22
Vieux 17/08/2012, 09h20   #15
gl
Rédacteur/Modérateur
 
Homme
Inscription : juin 2002
Messages : 2 034
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France, Hauts de Seine (Île de France)

Informations forums :
Inscription : juin 2002
Messages : 2 034
Points : 3 828
Points : 3 828
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.
gl est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 17/08/2012, 09h46   #16
leternel
Membre Expert
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 182
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 182
Points : 2 496
Points : 2 496
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.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est actuellement connecté   Envoyer un message privé Réponse avec citation 50
Vieux 17/08/2012, 10h17   #17
gl
Rédacteur/Modérateur
 
Homme
Inscription : juin 2002
Messages : 2 034
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France, Hauts de Seine (Île de France)

Informations forums :
Inscription : juin 2002
Messages : 2 034
Points : 3 828
Points : 3 828
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.
gl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2012, 11h19   #18
leternel
Membre Expert
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 182
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 182
Points : 2 496
Points : 2 496
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.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2012, 15h47   #19
matios
 
Inscription : octobre 2011
Messages : 46
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 46
Points : -6
Points : -6
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 ?
matios est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2012, 16h34   #20
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 293
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

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

Informations forums :
Inscription : janvier 2011
Messages : 1 293
Points : 2 848
Points : 2 848
Citation:
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.
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h31.


 
 
 
 
Partenaires

Hébergement Web