Cómo capturar y leer errores con la clase Handler

Clase 18 de 33Curso Avanzado de Laravel

Resumen

Domina el manejo de errores en Laravel con un enfoque claro y directo. Aquí verás cómo capturar, registrar y responder excepciones usando la clase handler, además de un ejemplo práctico para probar el flujo completo con una ruta GET y una respuesta JSON.

¿Qué es una excepción en Laravel y cómo se maneja?

Una excepción es un evento inesperado que ocurre durante la ejecución y interrumpe el flujo normal del programa. En Laravel, el manejo centralizado se realiza con la clase Handler ubicada en la carpeta app/exceptions dentro del archivo handler.php.

  • Handler: captura todas las excepciones y define cómo reportarlas y mostrarlas.
  • Configuración inicial: viene lista al crear un proyecto nuevo.
  • Flujo: las excepciones se registran con report y se convierten en respuesta con render.
  • Privacidad: existe un arreglo para no reportar ciertas excepciones y otro para ocultar inputs sensibles como la contraseña.

La respuesta final que ve el usuario puede ser una pantalla de error o un JSON personalizado. Todo depende de lo que definas en handler.php.

¿Cómo usar la clase handler: report y render?

La clase handler ofrece dos puntos clave para intervenir en el ciclo de vida de un error.

  • report: se usa para registrar excepciones o enviarlas a un servicio externo como Sentry. También puedes inspeccionar temporalmente el error con DD.
  • render: convierte la excepción en una respuesta HTTP para el navegador o el cliente.

¿Cómo registrar o inspeccionar con report?

  • Para revisar qué llega a report, puedes hacer un dump rápido.
// app/Exceptions/Handler.php
public function report($exception)
{
    // Inspección temporal del error
    dd($exception);

    // O delegar al comportamiento por defecto
    // parent::report($exception);
}
  • Si usas un servicio externo, report es el lugar para enviarlo.

¿Cómo personalizar la respuesta con render?

  • Si prefieres responder en JSON en lugar del HTML por defecto, ajusta render.
// app/Exceptions/Handler.php
public function render($request, $exception)
{
    return response()->json([
        'message' => $exception->getMessage(),
    ]);
}
  • Así, el cliente recibirá un objeto JSON con el mensaje de la excepción.
  • Puedes mantener el HTML por defecto si no necesitas API.

¿Cómo probar una excepción con una ruta GET?

Para validar el flujo completo, crea una ruta en web.php que lance una excepción usando la palabra reservada throw.

// routes/web.php
use Illuminate\Support\Facades\Route;
use Exception;

Route::get('/exception', function () {
    throw new Exception('Yo soy una excepción');
});
  • Visita la ruta y verás la salida del manejador: primero el HTML por defecto.
  • Si cambiaste render a JSON: obtendrás {"message":"Soy una excepción"}.

Puntos clave al probar: - throw: crea y lanza una nueva instancia de la excepción. - GET: la ruta se ejecuta al visitar el navegador. - Privacidad: los inputs sensibles como password no deben enviarse al reporte. - Servicios externos: Sentry es un ejemplo para el envío desde report.

¿Te gustaría que profundicemos en excepciones personalizadas y mejores prácticas de respuesta JSON? Deja tus dudas o casos reales en los comentarios.