finally
Le mot-clé "finally" en PHP garantit l'exécution d'un bloc de code après try et catch, qu'une exception ait été levée ou non.
Le mot-clé PHP "finally" : guide complet
Le mot-clé finally fait partie de la syntaxe de gestion des exceptions en PHP. Un bloc finally est attaché à une instruction try et s'exécute toujours après le bloc try (et tout bloc catch correspondant) — que le code ait réussi, levé une Exception ou effectué un retour anticipé. Cette garantie en fait l'endroit idéal pour le travail de nettoyage : fermer des fichiers, libérer des verrous, terminer des transactions de base de données ou journaliser des événements.
Cette page couvre la syntaxe, l'ordre exact d'exécution des blocs, la façon dont finally interagit avec return, et les cas d'utilisation courants où il est réellement nécessaire.
Syntaxe
Le bloc finally est attaché à une instruction try et s'exécute après les blocs try et tout bloc catch, qu'une exception ait été levée ou gérée ou non. Voici la syntaxe de base pour utiliser le mot-clé finally en PHP :
La syntaxe PHP de finally
try {
// code to be executed
} catch (Exception $e) {
// code to handle the exception
} finally {
// code to be executed regardless of whether an exception was thrown or caught
}Le bloc catch est facultatif lorsqu'un bloc finally est présent — try ... finally (sans catch) est du PHP valide. Dans ce cas, le bloc finally s'exécute quand même, mais toute exception reste non interceptée et se propage vers le haut une fois que finally a terminé.
Ordre d'exécution des blocs
L'ordre est toujours le même :
- Le bloc
trys'exécute. - Si une exception est levée, le premier bloc
catchcorrespondant s'exécute. Si aucun ne correspond, l'exception est conservée pour être relancée. - Le bloc
finallys'exécute — toujours. - Le contrôle quitte l'instruction (en retournant une valeur ou en relançant une exception non interceptée).
Ce petit script rend l'ordre visible :
<?php
function demo(bool $fail): void
{
try {
echo "1. try\n";
if ($fail) {
throw new Exception("boom");
}
} catch (Exception $e) {
echo "2. catch: {$e->getMessage()}\n";
} finally {
echo "3. finally\n";
}
echo "4. after\n";
}
demo(false);
echo "---\n";
demo(true);
// Output:
// 1. try
// 3. finally
// 4. after
// ---
// 1. try
// 2. catch: boom
// 3. finally
// 4. afterRemarquez que finally s'exécute dans les deux cas — une fois sans exception, une fois après le catch.
Exemples
Voici quelques exemples pratiques illustrant l'utilisation du mot-clé finally :
Exemples de finally en PHP
<?php
// Example 1
function divide($a, $b)
{
try {
if ($b == 0) {
throw new Exception("Division by zero.");
}
return $a / $b;
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
} finally {
echo "This code will always be executed.";
}
}
divide(10, 0);
// Output: Error: Division by zero.This code will always be executed.
// Example 2
$file = "example.txt";
$handle = fopen($file, "r");
try {
if (!$handle) {
throw new Exception("Unable to open file.");
}
// code to be executed
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
} finally {
if ($handle !== false) {
fclose($handle);
}
}
// Output: Error: Unable to open file.Dans ces exemples, nous utilisons le mot-clé finally pour garantir une exécution cohérente du code de nettoyage ou de journalisation.
finally et return
Un bloc finally s'exécute même lorsque try ou catch contient un return. PHP évalue la valeur de retour, exécute finally, puis effectue le retour réel. Si le bloc finally lui-même retourne une valeur, cette valeur remplace la précédente — une source subtile de bugs, il vaut donc mieux éviter de retourner depuis finally.
<?php
function withReturn(): string
{
try {
return "from try";
} finally {
echo "finally still runs\n";
}
}
function overriding(): string
{
try {
return "from try";
} finally {
return "from finally"; // overrides the try return
}
}
echo withReturn() . "\n";
echo overriding() . "\n";
// Output:
// finally still runs
// from try
// from finallyLa même règle de remplacement s'applique aux exceptions : si finally lève une exception, celle-ci remplace toute exception ou valeur de retour en attente depuis try/catch.
Avantages
L'utilisation du mot-clé finally présente plusieurs avantages, notamment :
- Gestion des erreurs améliorée : garantit que le code essentiel de nettoyage ou de journalisation s'exécute de manière cohérente, même lorsque des exceptions surviennent ou sont gérées.
- Code simplifié : élimine le besoin de dupliquer la logique de fermeture des ressources dans plusieurs blocs
catchou chemins d'erreur.
Conclusion
En résumé, le mot-clé finally offre un moyen fiable d'exécuter le code de nettoyage essentiel lors de la gestion des exceptions — fermeture des ressources, libération des verrous et journalisation — qu'une exception ait été levée ou non. Utilisez-le chaque fois qu'une ressource ouverte dans try doit être libérée quoi qu'il arrive, et évitez de faire un return depuis un bloc finally pour ne pas accidentellement masquer un résultat ou une exception.
Pour approfondir la gestion des erreurs PHP, consultez try, catch, la classe Exception et le guide général sur les exceptions PHP.