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:
- Se ejecuta el bloque
try. - Si se lanza una excepción, se ejecuta el primer bloque
catchque coincida. Si ninguno coincide, la excepción se retiene para ser relanzada. - El bloque
finallyse ejecuta — siempre. - 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. afterObserva 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 finallyLa 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
catcho 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.