- Zrozumienie podstaw obsługi wyjątków w Laravelu
- Konfigurowanie debugowania
- Wyjątki w raportowaniu
- Adding Global Context to Logs
- Rendering Exceptions
- Creating Custom HTTP Error Pages
- Using Reportable and Renderable Exceptions
- Throttling Exceptions
- Ignoring Exceptions
- Handling HTTP Exceptions
- Conclusion
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=truewyświetlanie szczegółowych komunikatów o błędach. -
Produkcja: Zawsze ustawione
APP_DEBUG=falsetak, 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óć
falsew 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
rendermoże również obsługiwać wbudowane wyjątki, takie jakNotFoundHttpException.
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:
- To customize default error templates, publish them using:
php artisan vendor:publish --tag=laravel-errors - Add your custom content to the
404.blade.phpview:<h2>{{ $exception->getMessage() }}</h2> <p>Sorry, the page you’re looking for doesn’t exist.</p> - 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.