Manejo de errores

Introduction

Cuando inicias un nuevo proyecto Laravel, el manejo de errores y excepciones ya está configurado para ti. La clase App\Exceptions\Handler es donde todas las excepciones activadas por tu aplicación son registradas y luego devueltas al usuario. Profundizaremos en esta clase a lo largo de esta documentación.

# Configuration

La opción debug en su archivo de configuración config/app.php determina cuánta información sobre un error se muestra realmente al usuario. Por defecto, esta opción está establecida para respetar el valor de la variable de entorno APP_DEBUG, que está almacenada en su archivo.env.

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

# El manejador de Excepciones

Informe de Excepciones

Todas las excepciones son manejadas por la clase  App\Exceptions\Handler. Esta clase contiene un método de register en el que se pueden registrar las llamadas personalizadas del reportero de excepciones y del renderizador. Examinaremos cada uno de estos conceptos en detalle. El informe de excepciones se utiliza para registrar las excepciones o enviarlas a un servicio externo como Flare, Bugsnag o Sentry. Por defecto, las excepciones se registrarán en base a su configuración de logging. Sin embargo, usted es libre de registrar las excepciones como desee.

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

use App\Exceptions\CustomException;

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

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

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

Para personalizar la presentación de informes de una excepción determinada, también puede considerar la posibilidad de utiliza reportable exceptions

Contexto Global Log

Si está disponible, Laravel añade automáticamente el ID del usuario actual a cada mensaje de registro de la excepción como datos contextuales. Puede definir sus propios datos contextuales globales anulando el método context de la clase App\Exceptions\Handler. Esta información se incluirá en cada mensaje de registro de excepciones escrito por su solicitud:

/**
 * Get the default context variables for logging.
 *
 * @return array
 */
protected function context()
{
    return array_merge(parent::context(), [
        'foo' => 'bar',
    ]);
}

El Helper report

A veces puede ser necesario informar de una excepción pero seguir tramitando la solicitud actual. La función del helper report le permite informar rápidamente de una excepción utilizando su manejador de excepciones sin que se produzca una página de error:

public function isValid($value)
{
    try {
        // Validate the value...
    } catch (Throwable $e) {
        report($e);

        return false;
    }
}

Ignorar excepciones por tipo

La propiedad $dontReport del manejador de excepciones contiene una serie de tipos de excepciones que no se registrarán. Por ejemplo, las excepciones resultantes de errores 404, así como varios otros tipos de errores, no se escriben en sus archivos de registro. Puede agregar otros tipos de excepción a esta matriz según sea necesario:

/**
 * A list of the exception types that should not be reported.
 *
 * @var array
 */
protected $dontReport = [
    \Illuminate\Auth\AuthenticationException::class,
    \Illuminate\Auth\Access\AuthorizationException::class,
    \Symfony\Component\HttpKernel\Exception\HttpException::class,
    \Illuminate\Database\Eloquent\ModelNotFoundException::class,
    \Illuminate\Validation\ValidationException::class,
];

Excepcion en la prestación de servicios

Por defecto, el manejador de excepciones de Laravel convertirá las excepciones en una respuesta HTTP para usted. Sin embargo, es libre de registrar un cierre de renderizado personalizado para las excepciones de un tipo determinado. Puede lograr esto a través del método renderable de su manejador de excepciones. Laravel deducirá qué tipo de excepción renderiza el Cierre examinando el tipo-pista del Cierre:

use App\Exceptions\CustomException;

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

Excepciones notificales y reproducibles

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

<?php

namespace App\Exceptions;

use Exception;

class RenderException extends Exception
{
    /**
     * Report the exception.
     *
     * @return void
     */
    public function report()
    {
        //
    }

    /**
     * Render the exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        return response(...);
    }
}

Si su excepción contiene una lógica de informe personalizada que sólo se produce cuando se cumplen ciertas condiciones, es posible que tenga que indicar a Laravel que informe de la excepción utilizando la configuración de gestión de excepciones predeterminada. Para ello, puede devolve false desde el método report de le excepción:

/**
 * Report the exception.
 *
 * @return bool|void
 */
public function report()
{
    // Determine if the exception needs custom reporting...

    return false;
}

Puede escribir a máquina cualquier dependencia necesaria del método report y se inyectarán automáticamente en el método por el service container de Laravel.

Excepción HTTP

Algunas excepciones describen códigos de error HTTP desde el servidor. Por ejemplo, un error "page not found" (404), un "unauthorized error" (401) o incluso un error 500 generado manualmente. Para generar una respuesta de este tipo desde cualquier punto de su aplicación, puede utilizar el helper abort:

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 errores para 404 códigos de estado HTTP, cree una página de resources/views/errors/404.blade.php. TEste archivo se servirá en todos los errores 404 generados por su aplicación. Las vistas dentro de este directorio deben ser nombradas para que coincidan con el código de estado HTTP al que corresponden. La instancia de HttpException se pasará a la vista como una variable $exception:

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

Puedes publicar las plantillas de la página de errores de Laravel usando el comando vendor:publish. una vez publicadas las plantillas, puedes personalizarlas a tu gusto:

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