Версія фреймворка: 8.x

Обробка помилок

Вступ

Коли ви запускаєте новий проект Laravel, для вас вже налаштовано обробку помилок та винятків.App\Exceptions\Handlerклас - це місце, де всі винятки, ініційовані вашою програмою, реєструються, а потім відображаються назад користувачеві. Ми поглибимось глибше в цей клас у цій документації.

Конфігурація

debugваріант у вашомуconfig/app.phpФайл конфігурації визначає, скільки інформації про помилку насправді відображається користувачеві. За замовчуванням ця опція встановлена ​​відповідно до значенняAPP_DEBUGзмінної середовища, яка зберігається у вашому.envфайл.

Для місцевого розвитку слід встановитиAPP_DEBUGсередовище змінна доtrue. У вашому виробничому середовищі це значення повинно бути завждиfalse. Якщо для значення встановлено значенняtrueу виробництві ви ризикуєте розкрити чутливі значення конфігурації кінцевим користувачам вашої програми.

Обробник винятків

Звітування про винятки

Усі винятки обробляєApp\Exceptions\Handlerклас. Цей клас міститьregisterметод, де ви можете зареєструвати користувальницькі виклики репортерів та рендерів. Ми детально розглянемо кожне з цих понять. Звітування про винятки використовується для реєстрації винятків або надсилання їх до зовнішньої служби, наприкладСпалах,БагснагабоВартовий. За замовчуванням винятки реєструватимуться на основі вашоголісозаготівляконфігурації. Однак ви можете реєструвати винятки, як завгодно.

Наприклад, якщо вам потрібно повідомляти про різні типи винятків різними способами, ви можете використовувати файлreportableметод реєстрації Закриття, яке слід виконати, коли потрібно повідомити про виняток даного типу. Laravel визначить, який тип виключення подано у звіті про закриття, вивчивши підказку про закриття:

use App\Exceptions\CustomException;

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

Коли ви реєструєте користувальницький виклик звітування за допомогоюreportableметоду, Laravel все одно реєструватиме виняток, використовуючи конфігурацію ведення журналу за промовчанням для програми. Якщо ви хочете зупинити розповсюдження винятку до стеку реєстрації за замовчуванням, ви можете використовуватиstopметод при визначенні вашого звітування про зворотний дзвінок або поверненняfalseіз зворотного дзвінка:

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

$this->reportable(function (CustomException $e) {
    return false;
});
Щоб налаштувати звітування про винятки для даного винятку, ви також можете розглянути можливість використаннязвітні винятки

Глобальний контекст журналу

Якщо доступно, Laravel автоматично додає ідентифікатор поточного користувача до повідомлення журналу кожного винятку як контекстні дані. Ви можете визначити свої власні глобальні контекстні дані, замінившиcontextметод вашої програмиApp\Exceptions\Handlerклас. Ця інформація буде включена в повідомлення журналу кожного винятку, написане вашим додатком:

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

reportПомічник

Іноді вам може знадобитися повідомити про виняток, але продовжувати обробляти поточний запит.reportдопоміжна функція дозволяє швидко повідомити про виняток, використовуючи ваш обробник винятків, не відображаючи сторінку помилки:

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

        return false;
    }
}

Ігнорування винятків за типами

$dontReportвластивість обробника винятків містить масив типів винятків, які не реєструватимуться. Наприклад, винятки, спричинені помилками 404, а також кілька інших типів помилок, не записуються до ваших журналів. За необхідності ви можете додати до цього масиву інші типи винятків:

/**
 * 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,
];

Візуалізація винятків

За замовчуванням обробник винятків Laravel перетворить винятки на відповідь HTTP для вас. Однак ви можете зареєструвати спеціальне закриття візуалізації для винятків певного типу. Ви можете досягти цього за допомогоюrenderableметод обробника винятків. Laravel визначить, який тип виключення робить Закриття, вивчивши підказку про Закриття:

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);
    });
}

Звітні та візуальні винятки

Замість перевірки типу винятків у обробнику винятківreportіrenderметоди, які ви можете визначитиreportіrenderметодів безпосередньо на власний виняток. Коли ці методи існують, їх буде автоматично викликати фреймворк:

<?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(...);
    }
}

Якщо ваш виняток містить власну логіку звітування, яка виникає лише при дотриманні певних умов, можливо, вам доведеться доручити Laravel повідомляти про виняток за допомогою конфігурації обробки винятків за замовчуванням. Для цього ви можете повернутисяfalseз винятківreportметод:

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

    return false;
}
Ви можете ввести натяк на будь-які необхідні залежностіreportметод, і вони будуть автоматично введені в метод методом Laravelслужбовий контейнер.

Винятки HTTP

Деякі винятки описують коди помилок HTTP із сервера. Наприклад, це може бути помилка "сторінку не знайдено" (404), "несанкціонована помилка" (401) або навіть помилка розробника, що згенерувала 500. Для того, щоб згенерувати таку відповідь з будь-якої точки вашої програми, ви можете використовуватиabortпомічник:

abort(404);

Спеціальні сторінки помилок HTTP

Laravel дозволяє легко відображати власні сторінки помилок для різних кодів стану HTTP. Наприклад, якщо ви хочете налаштувати сторінку помилки для 404 кодів стану HTTP, створітьresources/views/errors/404.blade.php. Цей файл буде подано для всіх 404 помилок, згенерованих вашим додатком. Представлення даних у цьому каталозі мають бути названі відповідно до коду стану HTTP, якому вони відповідають.HttpExceptionінстанція, піднятаabortфункція буде передана поданню як$exceptionзмінна:

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

Ви можете опублікувати шаблони сторінок помилок Laravel за допомогоюvendor:publishartisan командування. Після опублікування шаблонів ви можете налаштувати їх на свій смак:

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