- Понимание основ обработки исключений в Laravel
- Настройка отладки
- Отчеты об исключениях
- 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
Обработка исключений является неотъемлемой частью любого приложения, позволяя разработчикам корректно управлять ошибками и обеспечивать бесперебойную работу пользователей. 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:
Шаги по настройке:
- 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.
Вы также можете определить резервные шаблоны для групп ошибок, как 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 разработана как гибкая, что позволяет разработчикам настраивать и контролировать отчеты об ошибках и рендеринг по мере необходимости. Освоив эти методы, вы можете гарантировать, что ваше приложение корректно обрабатывает ошибки, сохраняя при этом бесперебойное взаимодействие с пользователем.