W3docs

finally

La palabra clave "finally" en PHP garantiza que un bloque de código se ejecute siempre, sin importar si se lanzó una excepción o no.

La palabra clave PHP "finally": una guía completa

La palabra clave finally forma parte de la sintaxis de manejo de excepciones de PHP. Un bloque finally se adjunta a una sentencia try y tiene garantizado ejecutarse después del bloque try (y cualquier bloque catch que coincida), ya sea que el código haya tenido éxito, haya lanzado una Exception o haya retornado anticipadamente. Esa garantía lo convierte en el lugar adecuado para el trabajo de limpieza: cerrar archivos, liberar bloqueos, finalizar transacciones de base de datos o registrar eventos.

Esta página cubre la sintaxis, el orden exacto en que se ejecutan los bloques, cómo interactúa finally con return, y los patrones comunes en los que realmente lo necesitas.

Sintaxis

El bloque finally se adjunta a una sentencia try y se ejecuta después del bloque try y cualquier bloque catch, independientemente de si se lanzó o manejó una excepción. Esta es la sintaxis básica para usar la palabra clave finally en PHP:

La sintaxis 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
}

El bloque catch es opcional cuando hay un bloque finally presente — try ... finally (sin catch) es PHP válido. En ese caso el bloque finally igual se ejecuta, pero cualquier excepción queda sin capturar y se propaga hacia arriba después de que finally termina.

Cómo se ejecutan los bloques

El orden es siempre el mismo:

  1. Se ejecuta el bloque try.
  2. Si se lanza una excepción, se ejecuta el primer bloque catch que coincida. Si ninguno coincide, la excepción se retiene para ser relanzada.
  3. El bloque finally se ejecuta — siempre.
  4. El control abandona la sentencia (retornando un valor, o relanzando una excepción no capturada).

Este pequeño script hace visible el orden:

<?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

Observa que finally se ejecuta en ambos casos: una vez sin excepción y otra vez después del bloque catch.

Ejemplos

Veamos algunos ejemplos prácticos de cómo se puede usar la palabra clave finally:

Ejemplos de PHP finally

<?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.

En estos ejemplos, usamos la palabra clave finally para garantizar que el código de limpieza o registro se ejecute de forma consistente.

finally y return

Un bloque finally se ejecuta incluso cuando try o catch contiene un return. PHP evalúa el valor de retorno, luego ejecuta finally y después retorna efectivamente. Si el propio bloque finally retorna un valor, ese valor anula el anterior — una fuente sutil de errores, por lo que conviene evitar retornar desde 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 misma regla de anulación se aplica a las excepciones: si finally lanza una excepción, esta reemplaza cualquier excepción o valor de retorno que estuviera pendiente de try/catch.

Beneficios

El uso de la palabra clave finally tiene varios beneficios, entre ellos:

  • Manejo de errores mejorado: garantiza que el código esencial de limpieza o registro se ejecute de forma consistente, incluso cuando ocurren o se manejan excepciones.
  • Código simplificado: elimina la necesidad de duplicar la lógica de cierre de recursos en múltiples bloques catch o rutas de error.

Conclusión

En resumen, la palabra clave finally proporciona una forma confiable de ejecutar código de limpieza esencial durante el manejo de excepciones — cerrando recursos, liberando bloqueos y registrando eventos — independientemente de si se lanzó una excepción. Úsala siempre que un recurso abierto en try deba liberarse sin importar qué, y evita usar return dentro de un bloque finally para no engullir accidentalmente un resultado o una excepción.

Para profundizar en el manejo de errores de PHP, consulta try, catch, la clase Exception y la guía general sobre excepciones de PHP.

Práctica

Práctica
¿Qué afirmaciones son verdaderas sobre la palabra clave 'finally' en PHP?
¿Qué afirmaciones son verdaderas sobre la palabra clave 'finally' en PHP?
Was this page helpful?