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étodowithExceptions 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.$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óndebug 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.
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 deconfig/logging.php.
Callbacks de reporte personalizados
Si quieres aplicar un procesamiento distinto según el tipo de excepción, pasa un closure al métodoreport.
Laravel deduce el tipo de excepción a partir del type hint del closure.
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().
Evitar reportes duplicados
Si la misma instancia de excepción se pasa varias veces areport(), 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étodocontext.
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étodolevel.
Throttling del reporte de excepciones
Cuando se producen muchas excepciones, puedes controlar el número de reportes con el métodothrottle.
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étodorender para convertir excepciones en respuestas.
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 cabeceraAccept de la petición.
Si quieres personalizar esta lógica, utiliza shouldRenderJsonWhen.
Personalizar la respuesta completa
Con el métodorespond puedes seguir manipulando la respuesta generada.
Clases de excepción personalizadas
Puedes crear tus propias clases de excepción en el directorioapp/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.
Control global de excepciones
Ignorar excepciones concretas
Indica condontReport las excepciones que no quieres reportar. La lógica de renderizado personalizada sigue funcionando.
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, usastopIgnoring.
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 enresources/views/errors/ plantillas Blade cuyo nombre de archivo sea el código de estado.
$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 convendor:publish.
Página de error de reserva
Como fallback cuando no exista una vista específica para el código de estado, puedes crear4xx.blade.php y 5xx.blade.php.
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 enbootstrap/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.Resumen
Resumen del reporte de excepciones
Resumen del reporte de excepciones
Resumen del renderizado de excepciones
Resumen del renderizado de excepciones
Resumen de las páginas de error HTTP
Resumen de las páginas de error HTTP
- Basta con crear archivos como
resources/views/errors/404.blade.phppara 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.
Buenas prácticas en producción
Buenas prácticas en producción
- Configura siempre
APP_DEBUG=falsepara 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.