• Czas czytania ~4 min
  • 28.01.2025

Obsługa wyjątków jest istotną częścią każdej aplikacji, umożliwiając programistom bezpieczne zarządzanie błędami i zapewnienie użytkownikom płynnego działania. Laravel upraszcza ten proces, oferując solidny system obsługi błędów i wyjątków od razu po wyjęciu z pudełka. W tym przewodniku omówimy krok po kroku, jak wykorzystać możliwości obsługi wyjątków Laravel w sposób przyjazny dla początkujących.

Zrozumienie podstaw obsługi wyjątków w Laravelu

Laravel jest wstępnie skonfigurowany z solidnym mechanizmem obsługi błędów i wyjątków. Dzięki temu nie musisz zaczynać od zera.

Rdzeniem $exceptions tej funkcjonalności jest obiekt znajdujący się w bootstrap/app.php pliku, który kontroluje, w jaki sposób wyjątki są zgłaszane (rejestrowane lub wysyłane do usługi zewnętrznej) i renderowane (wyświetlane użytkownikom).

Konfiguracja debugowania

Laravel używa zmiennej APP_DEBUG w .env pliku do określenia, ile informacji o błędzie ma być wyświetlane:

  • Rozwój lokalny: Ustaw APP_DEBUG=true wyświetlanie szczegółowych komunikatów o błędach.
  • Produkcja: Zawsze ustawione APP_DEBUG=false tak, aby nie ujawniać poufnych informacji.

Zaktualizuj .env plik:

APP_DEBUG=true

Zgłaszanie wyjątków

Laravel automatycznie rejestruje wyjątki na podstawie konfiguracji rejestrowania. Aby dostosować to zachowanie, możesz zdefiniować logikę raportowania specyficzną dla wyjątków.

Przykład: Zgłaszanie wyjątku

niestandardowego w bootstrap/app.php:

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->report(function (InvalidOrderException $e) {
        // Custom reporting logic
    })->stop();
});
  • Użyj ->stop() , aby zapobiec domyślnemu rejestrowaniu.
  • Wróć false w zamknięciu, aby całkowicie pominąć rejestrowanie.

Dodawanie kontekstu globalnego do dzienników Aby dzienniki

były bardziej znaczące, możesz dołączyć dane kontekstowe:

Kontekst

globalny Zdefiniuj dane globalne, które powinny pojawiać się w każdym wpisie dziennika:

niestandardowego w bootstrap/app.php:

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

Kontekst

specyficzny dla wyjątku Dodaj kontekst do określonych wyjątków, definiując metodę kontekstu w klasie wyjątku:

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

Wyjątki

renderowania Domyślnie Laravel konwertuje wyjątki na odpowiedzi HTTP. To zachowanie można zastąpić w przypadku określonych wyjątków.

Przykład: Niestandardowe renderowanie dla nieprawidłowych zamówień

niestandardowego w 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);
    });
});
  • Metoda render może również obsługiwać wbudowane wyjątki, takie jak NotFoundHttpException.

Przykład: W przypadku odpowiedzi

interfejsu API Renderuj wyjątki jako JSON:

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

Tworzenie niestandardowych stron

błędów HTTP Laravel umożliwia tworzenie niestandardowych stron błędów dla różnych kodów stanu HTTP. Aby dostosować stronę błędu 404:

Kroki do dostosowania:

  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.

Możesz także zdefiniować szablony awaryjne dla grup błędów, tak jak 4xx.blade.php dla wszystkich błędów 4xx.

Korzystanie z wyjątków

podlegających raportowaniu i renderowaniu Zamiast definiować logikę raportowania i renderowania globalnie, można ją zaimplementować bezpośrednio w niestandardowych klasach wyjątków.

Przykład: Niestandardowa klasa

wyjątku Utwórz nowy wyjątek:

php artisan make:exception InvalidOrderException

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

Wyjątki

ograniczania przepustowości Aby uniknąć zalewania dzienników zduplikowanymi błędami, Laravel umożliwia ograniczanie zgłoszonych wyjątków.

Przykład: Wyjątki

niestandardowego w bootstrap/app.php:

use Illuminate\Support\Lottery;

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->throttle(fn () => Lottery::odds(1, 1000));
});
  • Dzięki temu rejestrowany jest tylko jeden z każdych 1000 identycznych wyjątków.

Ignorowanie wyjątków

Niektóre wyjątki można wykluczyć z raportowania, dodając je do dontReport listy lub implementując interfejs.ShouldntReport

Przykład: Dodawanie wyjątków do dontReport listy

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

Przykład: oznaczanie wyjątków jako nieraportowalnych

namespace App\Exceptions;

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

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

Obsługa wyjątków

HTTP Aby programowo wyzwolić określone błędy HTTP, użyj pomocnika abort :

Przykład: Wyzwolenie błędu

abort(404, 'Page not found');

404 Wnioski

System obsługi wyjątków Laravel został zaprojektowany tak, aby był elastyczny, umożliwiając programistom dostosowywanie i kontrolowanie raportowania błędów i renderowania zgodnie z potrzebami. Opanowując te techniki, możesz upewnić się, że Twoja aplikacja z wdziękiem radzi sobie z błędami, zachowując bezproblemowe środowisko użytkownika.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

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...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297

Codziennie zestrzeliwujemy „Shahedy”. Za każdym razem to uratowane życie. Potrzebujemy mobilności: busa lub przyczepy. Każda wpłata = kolejna noc pod ochroną.

🚐 Zbiórka na busa dla zespołu, pułk 1020 🎯 Cel: 500 000 ₴
🔗 Link do zbiórkiі 💳 4441 1111 2546 4663