Manejo de errores en PHP: try/catch y más allá — guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Manejo de errores en PHP: desde construcciones básicas hasta patrones profesionales



Cualquier desarrollador PHP tarde o temprano se enfrenta a una situación en la que el código no se comporta como se esperaba. Archivo no encontrado, base de datos no disponible, el usuario ingresó datos incorrectos — todas estas son situaciones excepcionales. Un manejo adecuado de errores transforma una aplicación frágil en un sistema confiable. En este artículo, analizaremos todos los aspectos del trabajo con errores en PHP: desde el simple try/catch hasta la creación de clases de excepción propias y manejadores globales.



1. Fundamentos: la construcción try/catch y throw



En PHP, las excepciones son objetos de la clase Exception (o de sus herederos). El mecanismo básico consta de tres palabras clave:



  • try — bloque en el que se ejecuta el código potencialmente peligroso;
  • catch — bloque que captura la excepción;
  • throw — operador que «lanza» la excepción.


Veamos un ejemplo sencillo:



<?phpfunction divide($a, $b) {    if ($b == 0) {        throw new Exception('División por cero no es posible');    }    return $a / $b;}

try { echo divide(10, 0);} catch (Exception $e) { echo 'Error: ' . $e->getMessage();}?>


Cuando la ejecución llega a throw, PHP abandona inmediatamente la función actual y busca un bloque catch adecuado. Si se encuentra un catch, la ejecución continúa desde allí. Si no, se produce un error fatal.



Importante: a partir de PHP 7, la mayoría de los errores internos (por ejemplo, la división por cero) comenzaron a lanzar excepciones de la clase DivisionByZeroError. Para capturarlos, se debe especificar el tipo correspondiente.



2. Capacidades avanzadas: múltiples catch y finally



A menudo, en un mismo bloque try pueden ocurrir diferentes tipos de excepciones. PHP permite crear varios bloques catch para diferentes clases:



<?phpclass ValidationException extends Exception {}class DatabaseException extends Exception {}

try { // código que puede lanzar diferentes excepciones} catch (ValidationException $e) { echo 'Error de validación: ' . $e->getMessage();} catch (DatabaseException $e) { echo 'Error de base de datos: ' . $e->getMessage();} catch (Exception $e) { // Manejador general para todas las demás excepciones echo 'Error desconocido: ' . $e->getMessage();}?>


El orden de los bloques catch es importante: PHP los verifica secuencialmente, y el primero que coincida con el tipo captura la excepción. Por lo tanto, el catch (Exception $e) general siempre se coloca al final.



El bloque finally se ejecuta en cualquier caso — tanto después de la finalización exitosa de try, como después de la captura de una excepción, e incluso si en catch hubo un operador return. Es el lugar ideal para cerrar archivos, liberar recursos o escribir en el registro:



<?phpfunction readConfig($filename) {    $handle = fopen($filename, 'r');    if (!$handle) {        throw new Exception('No se pudo abrir el archivo');    }    try {        // lectura de datos        return fread($handle, filesize($filename));    } finally {        fclose($handle); // el archivo se cerrará incluso si hay una excepción    }}?>


3. Clases de excepción personalizadas y manejadores globales



Crear sus propias clases de excepción es una herramienta poderosa para estructurar el código. Basta con heredar de Exception:



<?phpclass InvalidEmailException extends Exception {    public function __construct($email, $code = 0, Throwable $previous = null) {        $message = \"El email '$email' tiene un formato no válido\";        parent::__construct($message, $code, $previous);    }}

function validateEmail($ema

Blogs

Book Recommendations