• Час читання ~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