Большинство веб-приложений имеют особые механизмы обработки ошибок. Используя их, они отслеживают ошибки и исключения и регистрируют их для анализа производительности. В этой главе вы прочитаете об обработке ошибок и исключений в приложениях Laravel.
Важные точки
Прежде чем продолжить подробное изучение обработки ошибок в Laravel, обратите внимание на следующие важные моменты:
- Для любого нового проекта Laravel по умолчанию регистрирует ошибки и исключения в классе App \ Exceptions \ Handler. Затем они отправляются обратно пользователю для анализа.
- Когда ваше приложение Laravel находится в режиме отладки, подробные сообщения об ошибках с трассировкой стека будут отображаться при каждой ошибке, возникающей в вашем веб-приложении.
Журнал ошибок
Регистрация ошибок в веб-приложении помогает отслеживать их и планировать стратегию их устранения. Информацию журнала можно настроить в веб-приложении в файле config / app.php. Обратите внимание на следующие моменты при работе с журналом ошибок в Laravel:
- Laravel использует библиотеку ведения журналов PHP monolog.
- Параметры ведения журнала, используемые для отслеживания ошибок: однократный, ежедневный, системный журнал и журнал ошибок.
- Например, если вы хотите регистрировать сообщения об ошибках в файлах журнала, вы должны установить значение журнала в конфигурации вашего приложения на ежедневно, как показано в следующей команде:
'log' => env('APP_LOG','daily'),'log_max_files' => 25;
Уровни серьезности
Поскольку Laravel использует библиотеку ведения журналов PHP monolog, существуют различные параметры, используемые для анализа уровней серьезности. Доступны различные уровни серьезности: сообщения об ошибках, критические, предупреждения и аварийные сообщения. Вы можете установить уровень серьезности, как показано в команде ниже —
'log_level' => env('APP_LOG_LEVEL', 'error')
Для Laravel 8, обновленного следующим образом
Для Laravel 8 мы находим новые методы в handler.php. Я делюсь своим кодом для обработки исключений в проекте Laravel.
По умолчанию проект Laravel поставляется с новым методом регистрации.
/** * Register the exception handling callbacks for the application. * * @return void */ public function register() { $this->reportable(function (Throwable $e){ }); }
Мы должны добавить сюда новый метод обработки исключений.
public function handleException( Throwable $e){ if ($e instanceof HttpException) { $code = $e->getStatusCode(); $defaultMessage = \Symfony\Component\HttpFoundation\Response::$statusTexts[$code]; $message = $e->getMessage() == "" ? $defaultMessage : $e->getMessage(); return $this->errorResponse($message, $code); } else if ($e instanceof ModelNotFoundException) { $model = strtolower(class_basename($e->getModel())); return $this->errorResponse("Does not exist any instance of {$model} with the given id", Response::HTTP_NOT_FOUND); } else if ($e instanceof AuthorizationException) { return $this->errorResponse($e->getMessage(), Response::HTTP_FORBIDDEN); } else if ($e instanceof TokenBlacklistedException) { return $this->errorResponse($e->getMessage(), Response::HTTP_UNAUTHORIZED); } else if ($e instanceof AuthenticationException) { return $this->errorResponse($e->getMessage(), Response::HTTP_UNAUTHORIZED); } else if ($e instanceof ValidationException) { $errors = $e->validator->errors()->getMessages(); return $this->errorResponse($errors, Response::HTTP_UNPROCESSABLE_ENTITY); } else { if (config('app.debug')) return $this->dataResponse($e->getMessage()); else { return $this->errorResponse('Try later', Response::HTTP_INTERNAL_SERVER_ERROR); } } }
Вы видите методы ответа как вызываемые. Например
return $this->errorResponse('Try later', Response::HTTP_INTERNAL_SERVER_ERROR);
Я создаю Черту для ответов. Вы тоже можете это сделать. Я разделяю с тобой свою черту.
/** * Data Response * @param $data * @return JsonResponse */ public function dataResponse($data): JsonResponse { return response()->json(['content' => $data], Response::HTTP_OK); } /** * Success Response * @param string $message * @param int $code * @return JsonResponse */ public function successResponse(string $message, $code = Response::HTTP_OK): JsonResponse { return response()->json(['success' => $message, 'code' => $code], $code); } /** * Error Response * @param $message * @param int $code * @return JsonResponse * */ public function errorResponse($message, $code = Response::HTTP_BAD_REQUEST): JsonResponse { return response()->json(['error' => $message, 'code' => $code], $code); }
Это моя черта тела. После создания этой характеристики и функции handleException вы добавляете код в метод register.
$this->renderable(function (Throwable $e) { return $this->handleException($e); });
После этого тело вашей функции будет выглядеть так.
public function register() { $this->reportable(function (Throwable $e){ }); $this->renderable(function (Throwable $e) { return $this->handleException($e); }); }
И в конце концов, ваша обработка исключений и ошибок работает очень хорошо.
Спасибо, что прочитали эту статью. Пожалуйста, поделитесь и аплодируйте для поддержки новых статей.