Manejo de errores en PHP: try/catch y más — 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: try/catch y más



El manejo de errores es una de las tareas clave de cualquier desarrollador web. Un código PHP bien escrito no solo ejecuta la lógica de negocio, sino que también reacciona correctamente ante situaciones imprevistas: archivo faltante, problemas con la base de datos, entrada de datos incorrecta por parte del usuario. En este artículo analizaremos en detalle cómo funciona el manejo de errores en PHP, comenzando con el básico try/catch y terminando con técnicas avanzadas: excepciones personalizadas y manejadores globales.



1. Fundamentos: la estructura try/catch



La forma más común de manejar errores en PHP moderno es la estructura try/catch. Permite "atrapar" una excepción (objeto de la clase Throwable o sus herederos) y ejecutar código alternativo en lugar de la terminación abrupta del script.



La sintaxis básica es la siguiente:

<?phptry {    // Código que puede lanzar una excepción    $file = fopen('data.txt', 'r');    if (!$file) {        throw new Exception('No se pudo abrir el archivo');    }    // Trabajar con el archivo...} catch (Exception $e) {    // Manejo del error    echo 'Ocurrió un error: ' . $e->getMessage();}?>


En el bloque try se coloca el código potencialmente peligroso. Si dentro de él ocurre una excepción (mediante throw o por un error interno de PHP), la ejecución pasa inmediatamente al bloque catch. La variable $e contiene el objeto de la excepción, al cual se le pueden llamar métodos:

  • getMessage() — texto del error;
  • getCode() — código numérico del error;
  • getFile() — archivo donde ocurrió el error;
  • getLine() — línea que provocó el error.


2. Bloque finally: código que se ejecuta siempre



A veces es necesario ejecutar ciertas acciones independientemente de si ocurrió un error o no — por ejemplo, cerrar la conexión con la base de datos o liberar recursos. Para esto se utiliza el bloque finally:

<?phpfunction processData($data) {    try {        // Operación peligrosa        if (empty($data)) {            throw new InvalidArgumentException('Los datos no pueden estar vacíos');        }        echo "Procesando datos...";        return true;    } catch (InvalidArgumentException $e) {        echo "Error: " . $e->getMessage() . "";        return false;    } finally {        echo "El bloque finally se ejecuta siempre.";    }}

processData([]); // Muestra: Error: Los datos no pueden estar vacíos, luego el bloque finallyprocessData('test'); // Muestra: Procesando datos..., luego el bloque finally?>


El bloque finally se ejecuta incluso si en try o catch hay una sentencia return. Esto garantiza la limpieza de recursos.



3. Excepciones personalizadas: extendiendo la clase Exception



En proyectos reales rara vez se utiliza solo la clase estándar Exception. Es mucho más conveniente crear clases de excepción propias para diferentes tipos de errores. Esto hace que el código sea más legible y facilita la captura de situaciones específicas.



Ejemplo: crearemos una excepción para errores de validación y otra para errores de base de datos.

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

function validateUser($age) { if ($age < 0 || $age > 150) { throw new ValidationException('Edad incorrecta'); } return true;}

function connectToDatabase($dsn) { if (empty($dsn)) { throw new DatabaseException('El DSN no puede estar vacío'); } // Simulación de conexión...}

try { validateUser(200);} catch (ValidationException $e) { echo 'Error de validación: ' . $e->getMessage();}

try { connectToDatabase('');} catch (DatabaseException $e) {

Blogs

Book Recommendations