Introducción

Cuando inicia un nuevo proyecto de Laravel, el manejo de errores y excepciones ya está configurado para usted. los AppExceptionsHandler La clase es donde todas las excepciones desencadenadas por su aplicación se registran y luego se devuelven al usuario. Profundizaremos en esta clase a lo largo de esta documentación.

Configuración

los debug opción en tu config/app.php El archivo de configuración determina cuánta información sobre un error se muestra realmente al usuario. De forma predeterminada, esta opción está configurada para respetar el valor de la APP_DEBUG variable de entorno, que se almacena en su .env expediente.

Para el desarrollo local, debe establecer el APP_DEBUG variable de entorno a true. En su entorno de producción, este valor siempre debe ser false. Si el valor se establece en true en producción, corre el riesgo de exponer valores de configuración confidenciales a los usuarios finales de su aplicación.

El controlador de excepciones

Informes de excepciones

Todas las excepciones son manejadas por el AppExceptionsHandler clase. Esta clase contiene un register método en el que puede registrar devoluciones de llamada de reportero y renderizador de excepciones personalizadas. Examinaremos cada uno de estos conceptos en detalle. Los informes de excepciones se utilizan para registrar excepciones o enviarlas a un servicio externo como Llamarada, Bugsnag o Centinela. De forma predeterminada, las excepciones se registrarán según su configuración de registro. Sin embargo, puede registrar las excepciones como desee.

Por ejemplo, si necesita informar diferentes tipos de excepciones de diferentes formas, puede utilizar la reportable método para registrar un cierre que debe ejecutarse cuando es necesario informar una excepción de un tipo determinado. Laravel deducirá qué tipo de excepción informa el Cierre examinando la sugerencia de tipo del Cierre:

useAppExceptionsCustomException;/**
 * Register the exception handling callbacks for the application.
 *
 * @return void
 */publicfunctionregister()$this->reportable(function(CustomException$e)//);

Cuando registra una devolución de llamada de informe de excepción personalizada utilizando el reportable , Laravel seguirá registrando la excepción utilizando la configuración de registro predeterminada para la aplicación. Si desea detener la propagación de la excepción a la pila de registro predeterminada, puede usar el stop método al definir su devolución de llamada o devolución de informes false de la devolución de llamada:

$this->reportable(function(CustomException$e)//)->stop();$this->reportable(function(CustomException$e)returnfalse;);

Para personalizar los informes de excepciones para una excepción determinada, también puede considerar el uso de excepciones notificables

Contexto de registro global

Si está disponible, Laravel agrega automáticamente la ID del usuario actual al mensaje de registro de cada excepción como datos contextuales. Puede definir sus propios datos contextuales globales anulando el context método de su aplicación AppExceptionsHandler clase. Esta información se incluirá en el mensaje de registro de cada excepción escrito por su aplicación:

/**
 * Get the default context variables for logging.
 *
 * @return array
 */protectedfunctioncontext()returnarray_merge(parent::context(),['foo'=>'bar',]);

los report Ayudante

A veces, es posible que deba informar una excepción, pero continuar manejando la solicitud actual. los report La función auxiliar le permite informar rápidamente una excepción utilizando su controlador de excepciones sin generar una página de error:

publicfunctionisValid($value)try// Validate the value...catch(Throwable$e)report($e);returnfalse;

Ignorar excepciones por tipo

los $dontReport La propiedad del manejador de excepciones contiene un array de tipos de excepciones que no se registrarán. Por ejemplo, las excepciones que resultan de errores 404, así como varios otros tipos de errores, no se escriben en sus archivos de registro. Puede agregar otros tipos de excepciones a este array según sea necesario:

/**
 * A list of the exception types that should not be reported.
 *
 * @var array
 */protected$dontReport=[IlluminateAuthAuthenticationException::class,IlluminateAuthAccessAuthorizationException::class,SymfonyComponentHttpKernelExceptionHttpException::class,IlluminateDatabaseEloquentModelNotFoundException::class,IlluminateValidationValidationException::class,];

Excepciones de representación

De forma predeterminada, el controlador de excepciones de Laravel convertirá las excepciones en una respuesta HTTP por usted. Sin embargo, puede registrar un cierre de renderizado personalizado para excepciones de un tipo determinado. Puede lograr esto a través del renderable método de su controlador de excepciones. Laravel deducirá qué tipo de excepción presenta el Cierre examinando la sugerencia de tipo del Cierre:

useAppExceptionsCustomException;/**
 * Register the exception handling callbacks for the application.
 *
 * @return void
 */publicfunctionregister()$this->renderable(function(CustomException$e,$request)returnresponse()->view('errors.custom',[],500););

Excepciones reportables y renderizables

En lugar de excepciones de verificación de tipo en el controlador de excepciones report y render métodos, puede definir report y render métodos directamente en su excepción personalizada. Cuando existan estos métodos, el marco los llamará automáticamente:

namespaceAppExceptions;useException;classRenderExceptionextendsException/**
     * Report the exception.
     *
     * @return void
     */publicfunctionreport()///**
     * Render the exception into an HTTP response.
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */publicfunctionrender($request)returnresponse(...);

Si tu excepción contiene una lógica de informes personalizada que solo ocurre cuando se cumplen ciertas condiciones, es posible que debas indicarle a Laravel que informe la excepción utilizando la configuración predeterminada de manejo de excepciones. Para lograr esto, puede regresar false de la excepción report método:

/**
 * Report the exception.
 *
 * @return bool|void
 */publicfunctionreport()// Determine if the exception needs custom reporting...returnfalse;

Puede escribir sugerencias sobre las dependencias necesarias del report y el contenedor de servicios de Laravel los inyectará automáticamente en el método.

Excepciones HTTP

Algunas excepciones describen códigos de error HTTP del servidor. Por ejemplo, esto puede ser un error de “página no encontrada” (404), un “error no autorizado” (401) o incluso un error 500 generado por el desarrollador. Para generar dicha respuesta desde cualquier lugar de su aplicación, puede utilizar el abort ayudante:

abort(404);

Páginas de error HTTP personalizadas

Laravel facilita la visualización de páginas de error personalizadas para varios códigos de estado HTTP. Por ejemplo, si desea personalizar la página de error para los códigos de estado HTTP 404, cree un resources/views/errors/404.blade.php. Este archivo se publicará en todos los errores 404 generados por su aplicación. Las vistas dentro de este directorio deben tener un nombre que coincida con el código de estado HTTP al que corresponden. los HttpException instancia planteada por el abort La función se pasará a la vista como una $exception variable:

<h2>$exception->getMessage()</h2>

Puede publicar las plantillas de página de error de Laravel usando el vendor:publish Mando artesanal. Una vez publicadas las plantillas, puedes personalizarlas a tu gusto:

php artisan vendor:publish --tag=laravel-errors