W3docs

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 :

  1. Le bloc try s'exécute.
  2. Si une exception est levée, le premier bloc catch correspondant s'exécute. Si aucun ne correspond, l'exception est conservée pour être relancée.
  3. Le bloc finally s'exécute — toujours.
  4. 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. after

Remarquez 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 finally

La 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 catch ou 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.

Pratique

Pratique
Quelles affirmations sont vraies concernant le mot-clé 'finally' en PHP ?
Quelles affirmations sont vraies concernant le mot-clé 'finally' en PHP ?
Was this page helpful?