Вступление

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

 

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

debugОпция в вашем файле конфигурации определяет , сколько информации об ошибке фактически отображается пользователю. По умолчанию эта опция настроена на значение переменной среды, которая хранится в вашем файле.config/app.phpAPP_DEBUG.env

Для локальной разработки вы должны установить APP_DEBUGпеременную окружения в true. В вашей производственной среде это значение всегда должно быть false. Если это значение установлено trueв рабочей среде, вы рискуете раскрыть конфиденциальные значения конфигурации конечным пользователям вашего приложения.

 

Обработчик исключений

Метод отчета

Все исключения обрабатываются классом. Этот класс содержит два метода: и . Мы рассмотрим каждый из этих методов подробно. Этот метод используется для регистрации исключений или отправки их во внешние службы, такие как Bugsnag или Sentry . По умолчанию метод передает исключение в базовый класс, в котором регистрируется исключение. Тем не менее, вы можете регистрировать исключения, как пожелаете.App\Exceptions\Handlerreportrenderreportreport

Например, если вам нужно сообщать о различных типах исключений по-разному, вы можете использовать instanceofоператор сравнения PHP :

/**
 * Report or log an exception.
 *
 * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
 *
 * @param  \Exception  $exception
 * @return void
 */
public function report(Exception $exception)
{
    if ($exception instanceof CustomException) {
        //
    }

    parent::report($exception);
}

Вместо того, чтобы делать много instanceofпроверок в вашем reportметоде, рассмотрите возможность использования отчетных исключений

Контекст глобального журнала

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

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

reportHelper

Иногда вам может потребоваться сообщить об исключении, но продолжить обработку текущего запроса. reportВспомогательная функция позволяет быстро сообщить исключение , используя ваш обработчик исключений в reportметод без рендеринга страницы ошибок:

public function isValid($value)
{
    try {
        // Validate the value...
    } catch (Exception $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,
];

 

Метод рендеринга

renderМетод отвечает за превращение данного исключения в ответ HTTP , которые должны быть отправлены обратно в браузер. По умолчанию исключение передается в базовый класс, который генерирует для вас ответ. Однако вы можете проверить тип исключения или вернуть свой собственный ответ:

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($exception instanceof CustomException) {
        return response()->view('errors.custom', [], 500);
    }

    return parent::render($request, $exception);
}

 

Отчетные и визуализируемые исключения

Вместо исключений типа проверки в обработчик исключений - х 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
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        return response(...);
    }
}

Вы можете напечатать любые необходимые зависимости reportметода, и они будут автоматически добавлены в метод сервисным контейнером Laravel .

 

Исключения HTTP

Некоторые исключения описывают коды ошибок HTTP с сервера. Например, это может быть ошибка «страница не найдена» (404), «неавторизованная ошибка» (401) или даже ошибка 500, созданная разработчиком. Чтобы сгенерировать такой ответ из любого места в вашем приложении, вы можете использовать abortпомощника:

abort(404);

abortПомощник немедленно возбудит исключение , которое будет вынесено обработчиком исключений. При желании вы можете предоставить текст ответа:

abort(403, 'Unauthorized action.');

 

Пользовательские страницы ошибок HTTP

Laravel позволяет легко отображать пользовательские страницы ошибок для различных кодов состояния HTTP. Например, если вы хотите настроить страницу ошибки для 404 кодов состояния HTTP, создайте . Этот файл будет обработан для всех 404 ошибок, сгенерированных вашим приложением. Представления в этом каталоге должны быть названы так, чтобы соответствовать коду статуса HTTP, которому они соответствуют. Экземпляр поднятых функций будет передан в представление в качестве переменного:resources/views/errors/404.blade.phpHttpExceptionabort$exception

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

Вы можете опубликовать шаблоны страниц ошибок Laravel с помощью команды Artisan. После того, как шаблоны были опубликованы, вы можете настроить их по своему вкусу:vendor:publish

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