Manejo de Excepciones en PHP

Objetivos de Aprendizaje
  • Entender el concepto de excepciones y su importancia en PHP
  • Aprender a utilizar bloques try-catch para manejar errores
  • Conocer cómo crear excepciones personalizadas
  • Dominar técnicas para capturar diferentes tipos de excepciones
  • Comprender el uso del bloque finally

¿Qué son las Excepciones?

Las excepciones en PHP son eventos anómalos o errores que ocurren durante la ejecución de un programa. A diferencia de los errores tradicionales, las excepciones permiten manejar situaciones problemáticas de manera estructurada y elegante, sin interrumpir abruptamente la ejecución del programa.

Ventajas de usar excepciones: Te permiten separar el código de manejo de errores del código principal, haciendo que tu programa sea más limpio, más fácil de leer y mantener.

Bloque try-catch

El bloque try-catch es la estructura básica para el manejo de excepciones en PHP. Consiste en:

  • try: Contiene el código que podría generar una excepción
  • catch: Captura y maneja la excepción si ocurre
ejemplo_try_catch.php
PHP Básico

<?php
try {
    // Código que podría generar una excepción
    $numero = 10;
    $division = $numero / 0; // Esto causará una excepción de división por cero
    echo "Este código no se ejecutará si hay una excepción";
} catch (DivisionByZeroError $e) {
    // Manejo de la excepción
    echo "Error: " . $e->getMessage();
    // getMessage() devuelve el mensaje de error asociado con la excepción
}
?>
                            
¿Qué está pasando?

En este ejemplo, intentamos dividir un número por cero, lo que causará una excepción. El bloque try-catch nos permite manejar esta situación de forma elegante, mostrando un mensaje de error en lugar de romper la ejecución del programa.

Tipos Comunes de Excepciones

Excepción Descripción Ejemplo de Uso
Exception Clase base para todas las excepciones Capturar cualquier tipo de excepción
Error Errores internos de PHP que normalmente no deberían ser capturados Errores fatales, desbordamiento de memoria
TypeError Error de tipo de datos Pasar string donde se espera un número
ValueError Valor inválido para la operación Argumentos fuera de rango
DivisionByZeroError División por cero Operaciones matemáticas inválidas
multiple_catch.php
PHP Intermedio

<?php
function checkNumber($number) {
    if (!is_numeric($number)) {
        throw new TypeError("Se esperaba un número");
    }
    
    if ($number <= 0) {
        throw new Exception("El número debe ser positivo");
    }
    
    return sqrt($number);
}

try {
    echo checkNumber("abc"); // Esto causará TypeError
    // echo checkNumber(-5);    // Esto causará Exception
    // echo checkNumber(16);    // Esto retornaría 4
} catch (TypeError $e) {
    echo "Error de tipo: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
    echo "Excepción general: " . $e->getMessage() . "<br>";
}
?>
                            
Importante

Al usar múltiples bloques catch, ordénalos de más específico a más general. Si pones Exception primero, capturará todas las excepciones y los bloques posteriores nunca se ejecutarán.

El Bloque Finally

El bloque finally se ejecuta siempre, independientemente de si se produce una excepción o no. Es útil para tareas de limpieza como cerrar conexiones o archivos.

finally_example.php
PHP Intermedio

<?php
function procesarArchivo($rutaArchivo) {
    $archivo = null;
    
    try {
        $archivo = fopen($rutaArchivo, 'r');
        if (!$archivo) {
            throw new Exception("No se pudo abrir el archivo");
        }
        
        // Procesar el archivo...
        while (!feof($archivo)) {
            $linea = fgets($archivo);
            echo $linea;
        }
    } catch (Exception $e) {
        echo "Error: " . $e->getMessage();
    } finally {
        // Cerrar el archivo si está abierto
        if ($archivo) {
            fclose($archivo);
            echo "<br>Archivo cerrado correctamente";
        }
    }
}

procesarArchivo('archivo_inexistente.txt');
?>