Skip to main content

Descripción general

Al crear un proyecto Laravel, el manejo de errores y excepciones ya está preconfigurado. La personalización se realiza en el método withExceptions de bootstrap/app.php.

Flujo de manejo de excepciones

Se muestra el recorrido desde que se produce una excepción hasta que se devuelve la respuesta al cliente.
El objeto $exceptions que se pasa al closure withExceptions es una instancia de Illuminate\Foundation\Configuration\Exceptions y gestiona el manejo de excepciones a nivel de aplicación.

Configuración de debug

La opción debug de config/app.php controla la cantidad de información que se muestra ante un error. Por defecto se utiliza el valor de la variable de entorno APP_DEBUG de .env.
En producción, APP_DEBUG debe ser siempre false. Dejarlo en true corre el riesgo de exponer información sensible al usuario final.

Reporte de excepciones

Reportar una excepción significa registrarla en el log o enviarla a servicios externos como Laravel Nightwatch, Sentry o Flare. Por defecto se registra según la configuración de config/logging.php.

Callbacks de reporte personalizados

Si quieres aplicar un procesamiento distinto según el tipo de excepción, pasa un closure al método report. Laravel deduce el tipo de excepción a partir del type hint del closure.
Aunque registres un callback personalizado, el logueo por defecto sigue funcionando. Si quieres detener la propagación al reporte por defecto, llama a stop() o devuelve false.

El helper report()

Cuando quieras reportar únicamente la excepción sin mostrar una página de error, usa el helper report().
El helper report() te permite registrar errores sin interrumpir la respuesta al usuario. Es útil para el manejo de excepciones en jobs en segundo plano y en procesos no críticos.

Evitar reportes duplicados

Si la misma instancia de excepción se pasa varias veces a report(), pueden crearse entradas duplicadas en el log. Con dontReportDuplicates(), la misma instancia solo se registra la primera vez.

Contexto global de logging

Si quieres añadir información común a todos los logs de excepción, usa el método context. Si está disponible, el ID del usuario actual se añade automáticamente.

Añadir un método context() a la clase de excepción

Si defines un método context() en la propia clase de excepción, podrás incluir en el log información contextual específica de esa excepción.

Cambiar el nivel de log

Para registrar una excepción concreta con un nivel de log determinado, usa el método level.

Throttling del reporte de excepciones

Cuando se producen muchas excepciones, puedes controlar el número de reportes con el método throttle.
Si quieres limitar por número de eventos por minuto, usa Limit.

Renderizado de excepciones

Renderizar es el proceso de convertir la excepción en una respuesta HTTP. Por defecto Laravel genera automáticamente una respuesta adecuada, pero puedes personalizarla.

Callback de renderizado personalizado

Pasa un closure al método render para convertir excepciones en respuestas.
También puedes sobrescribir el renderizado de excepciones integradas (como NotFoundHttpException). Si el closure no devuelve un valor, se utiliza el renderizado por defecto.

Detección automática de JSON / HTML

Laravel determina automáticamente si responder en HTML o JSON en función de la cabecera Accept de la petición. Si quieres personalizar esta lógica, utiliza shouldRenderJsonWhen.

Personalizar la respuesta completa

Con el método respond puedes seguir manipulando la respuesta generada.

Clases de excepción personalizadas

Puedes crear tus propias clases de excepción en el directorio app/Exceptions/. Si defines los métodos report() y render(), se invocarán automáticamente sin necesidad de escribir configuración en bootstrap/app.php.

Crear una clase de excepción

1

Crea la clase de excepción

2

Implementa report() y render()

En el método report() puedes usar inyección de dependencias con type hints. El service container de Laravel las resolverá automáticamente.

La interfaz ShouldntReport

Para las excepciones que no deban reportarse, implementa la interfaz ShouldntReport. Las excepciones que implementen esta interfaz no se reportan nunca.

Lanzar excepciones

El helper abort()

Desde cualquier parte de la aplicación puedes generar una respuesta HTTP de error.

abort_if() / abort_unless()

Helpers para lanzar la excepción condicionalmente.
Son útiles al hacer comprobaciones de permisos en controladores o middleware. A menudo se combinan con gates o policies.

Control global de excepciones

Ignorar excepciones concretas

Indica con dontReport las excepciones que no quieres reportar. La lógica de renderizado personalizada sigue funcionando.
Si quieres ignorar condicionalmente, pasa un closure a dontReportWhen.
Laravel ignora automáticamente por defecto ciertas excepciones, como el 404, un token CSRF inválido (419) o un origen no coincidente (403).

Volver a reportar excepciones que Laravel ignora

Para volver a reportar excepciones que se ignoran por defecto, usa stopIgnoring.

Páginas de error HTTP

En Laravel puedes definir vistas de error personalizadas por código de estado HTTP.

Crear vistas de error personalizadas

Crea en resources/views/errors/ plantillas Blade cuyo nombre de archivo sea el código de estado.
Dentro de la vista puedes acceder a la información de error mediante la variable $exception.

Publicar las plantillas de error por defecto

Si quieres usar las páginas de error estándar de Laravel como punto de partida para personalizar, obténlas con vendor:publish.

Página de error de reserva

Como fallback cuando no exista una vista específica para el código de estado, puedes crear 4xx.blade.php y 5xx.blade.php.
Para 404, 500 y 503, Laravel ya proporciona páginas de error por defecto. Para personalizar estos códigos, crea archivos específicos (por ejemplo, 404.blade.php) en lugar de usar el fallback.

Ejemplo práctico: manejador de excepciones para una API

En aplicaciones que exponen una API, hay que devolver siempre las excepciones en JSON. A continuación se muestra un ejemplo que centraliza los errores de la API en bootstrap/app.php.

Implementar una clase de excepción base para la API

Al crear una clase base de excepción específica para la API, puedes devolver respuestas de error uniformes desde cada endpoint.
Ejemplo de uso en un controlador.

Resumen

  • Basta con crear archivos como resources/views/errors/404.blade.php para que se usen automáticamente.
  • Puedes acceder a los detalles del error con la variable $exception.
  • Puedes obtener las plantillas por defecto con php artisan vendor:publish --tag=laravel-errors.
  • Puedes definir páginas de reserva con 4xx.blade.php / 5xx.blade.php.
  • Configura siempre APP_DEBUG=false para no mostrar los stack traces al usuario.
  • Integra servicios externos de tracking de errores como Sentry o Flare para gestionarlos de forma centralizada.
  • Usa throttle() para evitar desbordamientos del log cuando se producen muchas excepciones.
  • Mantén un formato uniforme de respuestas de error JSON en los endpoints de la API.
Última modificación el 2 de agosto de 2026