Класс Exceptions
Класс Exceptions находится в пространстве имён Illuminate\Foundation\Exceptions
и предоставляет методы для настройки обработки исключений в приложении.
В файле bootstrap/app.php вы можете использовать методы этого класса
для регистрации кастомных репортеров и рендереров.
Основные методы класса: reportable - регистрирует кастомный репортер
для определённого типа исключений, renderable - регистрирует
кастомный рендерер для определённого типа исключений,
dontReport - указывает исключения, которые не нужно логировать,
shouldRenderJsonWhen - задаёт условие для рендеринга ответа в формате JSON.
Синтаксис
<?php
use Illuminate\Foundation\Configuration\Exceptions;
return app->withExceptions(function (Exceptions $ex) {
// Регистрация обработчиков
});
?>
Пример использования reportable
Давайте зарегистрируем кастомный репортер для исключения CustomException,
который будет отправлять уведомление в Slack:
<?php
use Illuminate\Foundation\Configuration\Exceptions;
use App\Exceptions\CustomException;
use Illuminate\Support\Facades\Log;
return app->withExceptions(function (Exceptions $ex) {
$ex->reportable(function (CustomException $e) {
Log::channel('slack')->error('Custom exception occurred: ' . $e->getMessage());
});
});
?>
Результат выполнения кода:
"Custom exception logged to Slack channel"
Теперь при возникновении CustomException, исключение будет
отправлено в Slack, а стандартная обработка логирования продолжит работу.
Пример использования renderable
Давайте зарегистрируем кастомный рендерер для исключения CustomException,
который будет возвращать кастомный JSON-ответ:
<?php
use Illuminate\Foundation\Configuration\Exceptions;
use App\Exceptions\CustomException;
use Illuminate\Http\JsonResponse;
return app->withExceptions(function (Exceptions $ex) {
$ex->renderable(function (CustomException $e) {
return new JsonResponse([
'error' => 'Custom error',
'message' => $e->getMessage(),
], 400);
});
});
?>
Результат выполнения кода при возникновении исключения:
{"error":"Custom error","message":"Something went wrong"}
Теперь при возникновении CustomException, клиент получит
кастомный JSON-ответ со статусом 400.
Пример использования dontReport
Давайте укажем, что исключение CustomException не должно
логироваться в стандартные логи Laravel:
<?php
use Illuminate\Foundation\Configuration\Exceptions;
use App\Exceptions\CustomException;
return app->withExceptions(function (Exceptions $ex) {
$ex->dontReport([
CustomException::class,
]);
});
?>
Результат выполнения кода:
"CustomException will not be logged"
Теперь CustomException не будет записываться в файл логов,
если вы не добавили для него кастомный репортер.
Пример использования shouldRenderJsonWhen
Давайте настроим условие, при котором все исключения будут рендериться в JSON-формате:
<?php
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Http\Request;
return app->withExceptions(function (Exceptions $ex) {
$ex->shouldRenderJsonWhen(function (Request $request) {
return $request->expectsJson() || $request->is('api/*');
});
});
?>
Результат выполнения кода при запросе к API:
{"message":"Server Error","status":500}
Теперь для всех запросов, ожидающих JSON или начинающихся с api/,
исключения будут возвращаться в формате JSON.
Пример полной конфигурации
Давайте объединим все методы в одном файле конфигурации:
<?php
use Illuminate\Foundation\Configuration\Exceptions;
use App\Exceptions\CustomException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
return app->withExceptions(function (Exceptions $ex) {
// Не логировать определённые исключения
$ex->dontReport([
CustomException::class,
]);
// Кастомный репортер
$ex->reportable(function (CustomException $e) {
Log::channel('slack')->error('Custom exception occurred: ' . $e->getMessage());
});
// Кастомный рендерер
$ex->renderable(function (CustomException $e) {
return new JsonResponse([
'error' => 'Custom error',
'message' => $e->getMessage(),
], 400);
});
// Условие для JSON-рендеринга
$ex->shouldRenderJsonWhen(function (Request $request) {
return $request->expectsJson() || $request->is('api/*');
});
});
?>
Результат выполнения кода при возникновении CustomException в API:
{"error":"Custom error","message":"Something went wrong"}
Эта полная конфигурация демонстрирует все основные возможности
класса Exceptions для обработки исключений в приложении.
Смотрите также
-
класс
Handler,
который отвечает за обработку исключений в приложении -
метод
report,
который используется для логирования исключений -
метод
render,
который преобразует исключение в HTTP-ответ -
метод
shouldReport,
который определяет, нужно ли логировать исключение