PHP intègre désormais le bloc "Finally"
Pour une gestion plus propre des sorties d'exceptions

Les rubriques (actu, forums, tutos) de Développez
Tags
Réseaux sociaux


 Discussion forum

Sur le même sujet
Le , par tarikbenmerar, Chroniqueur Actualités
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 ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de Gugelhupf Gugelhupf
http://www.developpez.com
Membre Expert
le 16/08/2012 14:29
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 ?
Avatar de ProgrammeurDotNet ProgrammeurDotNet
http://www.developpez.com
Membre du Club
le 16/08/2012 14:35
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.
Avatar de leternel leternel
http://www.developpez.com
Expert Confirmé Sénior
le 16/08/2012 14:41
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.
Avatar de Paul TOTH Paul TOTH
http://www.developpez.com
Expert Confirmé Sénior
le 16/08/2012 14:49
c'est pas mal...mais c'est pas prêt d'arriver sur l'ensemble des hébergeurs et clients
Avatar de arkadih arkadih
http://www.developpez.com
Nouveau Membre du Club
le 16/08/2012 15:15
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.
Avatar de Guilp Guilp
http://www.developpez.com
Membre Expert
le 16/08/2012 15:23
finally...

(désolé. pas pu m'en empêcher )
Avatar de iubito iubito
http://www.developpez.com
Membre chevronné
le 16/08/2012 16:34
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.
Avatar de moriarti13 moriarti13
http://www.developpez.com
Nouveau Membre du Club
le 16/08/2012 17:05
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...
Avatar de dourouc05 dourouc05
http://www.developpez.com
Responsable Qt
le 16/08/2012 17:43
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 ?).
Avatar de Xinu2010 Xinu2010
http://www.developpez.com
Membre éclairé
le 16/08/2012 18:25
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
Offres d'emploi IT
Architecte / administrateur réseaux & sécurité
CDI
Capital Fund Management - Ile de France - Paris (75007)
Parue le 15/10/2014
Ingénieur décisionnel/ consultant bi (h/f)
CDI
CTS - Midi Pyrénées - Toulouse (31000)
Parue le 06/10/2014
Chef de projet/lead technique web h/f
CDI
Pages Jaunes - Ile de France - Paris (75000)
Parue le 14/10/2014

Voir plus d'offres Voir la carte des offres IT
 
 
 
 
Partenaires

PlanetHoster
Ikoula