• Время чтения ~4 мин
  • 28.01.2025

Обработка исключений является неотъемлемой частью любого приложения, позволяя разработчикам корректно управлять ошибками и обеспечивать бесперебойную работу пользователей. Laravel упрощает этот процесс, предлагая надежную систему обработки ошибок и исключений. В этом руководстве мы шаг за шагом рассмотрим, как использовать возможности обработки исключений Laravel удобным для новичков способом.

Понимание основ обработки исключений в Laravel

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

Ядром этой функциональности является $exceptions объект, найденный bootstrap/app.php в файле, который управляет тем, как исключения сообщаются (регистрируются или отправляются во внешнюю службу) и отображаются (отображаются пользователям).

Настройка отладки

Laravel использует APP_DEBUG переменную в файле .env , чтобы определить, сколько информации об ошибке отображать:

  • Местное развитие: Настроен APP_DEBUG=true на отображение подробных сообщений об ошибках.
  • Производство: Всегда настроен APP_DEBUG=false на то, чтобы не раскрывать конфиденциальную информацию.

Обновите .env файл:

APP_DEBUG=true

Отчеты об исключениях

Laravel автоматически регистрирует исключения на основе конфигурации ведения журнала. Чтобы настроить это поведение, можно определить логику отчетов, специфичную для исключений.

Пример: Сообщение о пользовательском исключении

в bootstrap/app.php:

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->report(function (InvalidOrderException $e) {
        // Custom reporting logic
    })->stop();
});
  • Используется ->stop() для предотвращения ведения журнала по умолчанию.
  • Вернитесь false в закрытие, чтобы полностью пропустить ведение журнала.

Добавление глобального контекста в журналы

Чтобы сделать ваши журналы более информативными, вы можете включить в них контекстные данные:

Глобальный контекст

Определите глобальные данные, которые должны отображаться в каждой записи журнала:

в bootstrap/app.php:

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->context(fn () => ['user_id' => auth()->id()]);
});

Контекст

, специфичный для исключения Добавьте контекст к конкретным исключениям, определив метод контекста в классе исключений:

public function context(): array
{
    return ['order_id' => $this->orderId];
}

Рендеринг исключений

По умолчанию Laravel преобразует исключения в HTTP-ответы. Вы можете переопределить это поведение для определенных исключений.

Пример: Пользовательский рендеринг для недействительных заказов

в bootstrap/app.php:

use App\Exceptions\InvalidOrderException;
use Illuminate\Http\Request;

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->render(function (InvalidOrderException $e, Request $request) {
        return response()->view('errors.invalid-order', [], 500);
    });
});
  • Метод render также может обрабатывать встроенные исключения, такие как NotFoundHttpException.

Пример: Для ответов

API отображайте исключения в формате JSON:

$exceptions->render(function (NotFoundHttpException $e, Request $request) {
    return $request->is('api/*')
        ? response()->json(['message' => 'Not found'], 404)
        : null;
});

Создание пользовательских страниц ошибок HTTP Laravel

позволяет создавать пользовательские страницы ошибок для различных кодов состояния HTTP. Чтобы настроить страницу с ошибкой 404:

Шаги по настройке:

  1. To customize default error templates, publish them using:
    php artisan vendor:publish --tag=laravel-errors
    
  2. Add your custom content to the 404.blade.php view:
      <h2>{{ $exception->getMessage() }}</h2>
    <p>Sorry, the page you’re looking for doesn’t exist.</p>
    
  3. Test the page by navigating to a non-existent route.

Вы также можете определить резервные шаблоны для групп ошибок, как 4xx.blade.php для всех ошибок 4xx.

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

исключений.

Пример: Пользовательский класс исключения Создайте

новое исключение:

php artisan make:exception InvalidOrderException

В App\Exceptions\InvalidOrderException:

namespace App\Exceptions;

use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class InvalidOrderException extends Exception
{
    public function report(): void
    {
        // Custom reporting logic
    }
    public function render(Request $request): Response
    {
        return response()->view('errors.invalid-order', [], 500);
    }
}

Регулирование исключений

Чтобы избежать переполнения журналов повторяющимися ошибками, Laravel позволяет регулировать зарегистрированные исключения.

Пример: Регулирование исключений

в bootstrap/app.php:

use Illuminate\Support\Lottery;

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->throttle(fn () => Lottery::odds(1, 1000));
});
  • Это гарантирует, что в журнал будет зарегистрировано только одно из каждых 1000 идентичных исключений.

Игнорирование исключений Вы

можете исключить определенные исключения, добавив их в dontReport список или реализовав интерфейс.ShouldntReport

Пример: добавление исключений в dontReport список

$exceptions->dontReport([
    InvalidOrderException::class,
]);

Пример: пометка исключений как не подлежащих

namespace App\Exceptions;

use Exception;
use Illuminate\Contracts\Debug\ShouldntReport;

class CustomException extends Exception implements ShouldntReport
{
    // ...
}

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

HTTP Чтобы программно инициировать определенные ошибки HTTP, используйте вспомогательную abort программу:

Пример: запуск ошибки

abort(404, 'Page not found');

404 Система

обработки исключений Laravel разработана как гибкая, что позволяет разработчикам настраивать и контролировать отчеты об ошибках и рендеринг по мере необходимости. Освоив эти методы, вы можете гарантировать, что ваше приложение корректно обрабатывает ошибки, сохраняя при этом бесперебойное взаимодействие с пользователем.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297

Мы сбиваем «шахеды» каждый день. Каждое сбитие — спасённые жизни. Нам нужна мобильность: бус или прицеп. Каждый донат = ещё одна ночь под защитой.

🚐 Сбор на микроавтобус для моего экипажа, полк 1020 🎯 Цель: 500 000 ₴
🔗 Ссылка на банку 💳 4441 1111 2546 4663