Un sitio que se rompe y muestra el código al usuario da una imagen de poca profesionalidad. En 2026, el manejo de excepciones es la red de seguridad de tus aplicaciones.

Solución Rápida (Code Snippet)

Estructura básica de un bloque try-catch-finally con excepciones personalizadas.

<?php
class SaldoInsuficienteException extends Exception {}

function realizarPago($monto, $saldo) {
    if ($monto > $saldo) {
        throw new SaldoInsuficienteException("No tienes dinero suficiente.");
    }
    return "Pago de $$monto realizado.";
}

try {
    echo realizarPago(100, 50);
} catch (SaldoInsuficienteException $e) {
    // Error específico de negocio
    echo "Aviso: " . $e->getMessage();
} catch (Exception $e) {
    // Error genérico
    error_log($e->getMessage()); // Guardamos en el log del servidor
    echo "Lo sentimos, hubo un error técnico.";
} finally {
    echo " - Proceso de pago finalizado.";
}

Cómo funciona

  1. throw: Lanza una “bomba” de error. Detiene la ejecución normal y busca el bloque catch más cercano.
  2. Multi-Catch: Puedes tener varios bloques catch para manejar distintos tipos de errores de forma diferente (ej. un aviso amigable para el usuario vs un log técnico).
  3. Jerarquía: PHP tiene una clase base Throwable. Casi todas las excepciones heredan de Exception.
  4. Custom Exceptions: Crear tus propias clases (como SaldoInsuficienteException) hace que tu código sea mucho más fácil de depurar.

Buenas Prácticas

  • Nunca dejes un catch vacío: Al menos registra el error en un log. Un error silencioso es el más difícil de arreglar.
  • No uses excepciones para controlar el flujo: Solo úsalas para situaciones verdaderamente “excepcionales”, no para validaciones normales.

Enlaces Internos


Preguntas Frecuentes

¿Cómo muestro errores bonitos al usuario?

Usa el bloque catch para redirigir a una página de error 500 personalizada o mostrar una notificación Toast.

¿Qué hace set_exception_handler?

Permite definir una función global que atrape cualquier excepción que no haya sido capturada por un try-catch, evitando el famoso “Fatal Error”.