Try, Catch, Finally
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 68 de 91.
Ahora que sabes cómo crear y lanzar excepciones, necesitas aprender a capturarlas. La estructura try-catch-finally te permite manejar las excepciones correctamente en lugar de dejar que bloqueen tu aplicación.
Envuelve el código que podría lanzar una excepción en un bloque try y después gestiona la excepción en un bloque catch:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
$calc = new Calculator();
try {
echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage();
}
Salida:
Error: Cannot divide by zeroPuedes capturar distintos tipos de excepciones con varios bloques catch. PHP los comprueba en orden, así que coloca primero las excepciones más específicas:
<?php
try {
// código riesgoso
} catch (InvalidArgumentException $e) {
echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
echo "Something went wrong: " . $e->getMessage();
}
El bloque finally se ejecuta independientemente de si se lanzó o capturó una excepción. Es perfecto para tareas de limpieza, como cerrar conexiones:
<?php
try {
echo "Attempting operation\n";
throw new Exception("Failed");
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup complete";
}
Salida:
Attempting operation
Caught: Failed
Cleanup completeEl bloque finally se ejecuta incluso si devuelves el control desde dentro de los bloques try o catch, lo que lo hace confiable para las operaciones esenciales de limpieza.
Desafío
FácilConstruyamos un sistema de procesamiento de archivos que demuestre cómo try-catch-finally funciona conjuntamente para gestionar los errores correctamente y garantizar que la limpieza siempre se realice.
Organizarás tu código en tres archivos:
FileException.php: Crea una clase personalizadaFileExceptionque extiendaException. Esta representará los errores relacionados con archivos en tu sistema.FileProcessor.php: Crea una claseFileProcessorque simule operaciones con archivos. Incluye el archivo FileException. Tu clase debe tener:- Una propiedad booleana privada
$isOpeninicializada enfalse - Un método
open(string $filename): voidque establezca$isOpenentruee imprima"Opening: [filename]". Si el nombre de archivo es"invalid.txt", lanza unaFileExceptioncon el mensaje"Cannot open file" - Un método
process(): voidque imprima"Processing file...". Si$isOpenesfalse, lanza unaRuntimeExceptioncon el mensaje"File not open" - Un método
close(): voidque establezca$isOpenenfalsee imprima"File closed" - Un método
isOpen(): boolque devuelva el estado actual
- Una propiedad booleana privada
main.php: Incluye el archivo FileProcessor. Recibirás una entrada: un nombre de archivo.Crea un
FileProcessory utiliza una estructuratry-catch-finallypara:- En el bloque
try: llama aopen()con el nombre de archivo y después llama aprocess() - Captura primero
FileExceptione imprime"File error: [message]" - Captura
RuntimeExceptione imprime"Runtime error: [message]" - En el bloque
finally: comprueba si el archivo está abierto medianteisOpen()y, si lo está, llama aclose(). Después, imprime"Cleanup complete"
- En el bloque
El bloque finally garantiza que la limpieza se realice tanto si las operaciones tienen éxito como si fallan. Este patrón es esencial para gestionar recursos como archivos, conexiones de bases de datos o sockets de red, cuya limpieza debe realizarse independientemente de lo que ocurra durante el procesamiento.
Pruébalo tú mismo
<?php
require_once 'FileProcessor.php';
// Leer entrada
$filename = trim(fgets(STDIN));
// TODO: Crea una instancia de FileProcessor
// TODO: Usa la estructura try-catch-finally:
// - En el bloque try: llama a open() con el filename, luego llama a process()
// - Captura FileException primero e imprime "File error: [message]"
// - Captura RuntimeException e imprime "Runtime error: [message]"
// - En el bloque finally: comprueba si el archivo está abierto usando isOpen(), si es así llama a close()
// Then print "Cleanup complete"
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada11Sistema de tipos y manejo de errores
Declaraciones de tiposTipos anulablesTipos unión e intersecciónClases de excepcionesJerarquía de excepciones personalizadaTry, Catch, FinallyRepaso: validador de formularios3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online