Sobes.tech
Junior

¿En qué consiste el manejo de errores y excepciones en PHP?

sobes.tech AI

Respuesta de la IA

El manejo de errores y excepciones en PHP permite controlar la ejecución del programa en situaciones incorrectas, prevenir fallos fatales y proporcionar información significativa al usuario.

Errores

Los errores son problemas que ocurren a nivel del intérprete de PHP. Pueden ser sintácticos, lógicos o surgir al acceder a recursos inexistentes. Los niveles de error se determinan mediante constantes (E_ERROR, E_WARNING, E_NOTICE, etc.) y pueden configurarse con error_reporting y display_errors.

Para manejar errores, se utilizan funciones personalizadas registradas con set_error_handler(). Esta función intercepta errores (excepto E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING), permitiendo registrarlos, mostrar un mensaje, detener la ejecución del script o continuar.

<?php
// Función personalizada de manejo de errores
function myErrorHandler($errno, $errstr, $errfile, $errline) {
    // Registro del error
    error_log("Error [$errno]: $errstr en el archivo $errfile en la línea $errline");

    // Mostrar mensaje al usuario (según el entorno)
    if (ini_get('display_errors')) {
        echo "Ocurrió un error: [$errno] $errstr<br>";
        echo "En el archivo: $errfile en la línea: $errline<br>";
    }

    // Detener la ejecución en errores críticos
    if ($errno == E_USER_ERROR) {
        die("Error crítico. Script detenido.");
    }

    // Continuar con el manejo estándar de PHP si la función devuelve false
    // return false;
}

// Registrar la función manejadora
set_error_handler("myErrorHandler");

// Ejemplo de error
// echo $undeclaredVar; // Generará E_NOTICE

Excepciones

Las excepciones son objetos que se lanzan en situaciones excepcionales. Permiten estructurar el código y gestionar el flujo de ejecución de manera más flexible que el manejo tradicional de errores.

Se manejan con la construcción try...catch...finally:

  • try: Bloque de código donde puede ocurrir una excepción.
  • catch: Bloque que se ejecuta si en try o en otro catch se lanza una excepción del tipo especificado. Se pueden usar múltiples catch para diferentes tipos.
  • finally: (disponible desde PHP 5.5) Bloque que siempre se ejecuta, independientemente de si se lanzó o no una excepción y si fue atrapada.
<?php
function divide($a, $b) {
    if ($b === 0) {
        throw new Exception("División por cero no es posible.");
    }
    return $a / $b;
}

try {
    echo divide(10, 2) . "<br>";
    echo divide(5, 0) . "<br>"; // Se generará una excepción
    echo "Este código no se ejecutará si la línea anterior lanza una excepción.";
} catch (Exception $e) {
    echo "Excepción atrapada: " . $e->getMessage() . "<br>";
    // También se puede obtener el archivo, línea y pila de llamadas
    // echo "En archivo: " . $e->getFile() . " en la línea: " . $e->getLine() . "<br>";
    // echo "Pila de llamadas:<pre>" . $e->getTraceAsString() . "</pre>";
} finally {
    // Este bloque siempre se ejecuta
    echo "Operación finalizada.<br>";
}

Clases de excepciones

PHP ofrece la clase base Exception, de la cual heredan otras clases de excepciones integradas (por ejemplo, InvalidArgumentException, RuntimeException). Se pueden crear clases propias de excepciones heredando de Exception o sus descendientes, para representar más precisamente los tipos de errores.

<?php
class MyCustomException extends Exception {
    // Se pueden agregar propiedades y métodos propios
}

function processData($data) {
    if (empty($data)) {
        throw new MyCustomException("Faltan datos para procesar.");
    }
    // ... procesamiento de datos
}

try {
    processData([]);
} catch (MyCustomException $e) {
    echo "Excepción personalizada atrapada: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
    echo "Otra excepción atrapada: " . $e->getMessage() . "<br>";
}

Principios generales

  • No capture errores que no puedas manejar. Si no sabes cómo reaccionar correctamente a un error, déjalo que suba para ser manejado por otro manejador.
  • Las excepciones son mejores para situaciones esperadas pero excepcionales (por ejemplo, error de entrada de usuario, imposibilidad de conectar a la base de datos). Los errores suelen indicar problemas en el código o entorno.
  • Registra errores y excepciones. Es fundamental para depuración y monitoreo.
  • No reveles información sensible al usuario en mensajes de error.
  • Usa set_exception_handler() para manejar excepciones no atrapadas. Esto ayuda a prevenir errores fatales y a degradar graceful.
<?php
// Manejador de excepciones no atrapadas
function myExceptionHandler($exception) {
    error_log("Excepción no atrapada: " . $exception->getMessage());
    // Redirigir a página de error, mostrar mensaje general, etc.
    echo "Ocurrió un error inesperado en el servidor. Intenta más tarde.";
}

set_exception_handler('myExceptionHandler');

// Este código lanzará una excepción que será atrapada por myExceptionHandler
// throw new Exception("Esta es una excepción no atrapada.");

Por lo tanto, un uso adecuado de los mecanismos de manejo de errores y excepciones es fundamental para crear aplicaciones PHP confiables y mantenibles.