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 :
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
8
9 $db = mysqli_connect(); try { call_some_function($db); } catch (Exception $e) { mysqli_close($db); throw $e; } 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 $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); }
Ce code affichera « this will be called ». Le texte après le bloc try/finally ne sera pas affiché.
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";
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 ?
Partager