Большинство веб-приложений имеют особые механизмы обработки ошибок. Используя их, они отслеживают ошибки и исключения и регистрируют их для анализа производительности. В этой главе вы прочитаете об обработке ошибок и исключений в приложениях 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);
});
}
И в конце концов, ваша обработка исключений и ошибок работает очень хорошо.
Спасибо, что прочитали эту статью. Пожалуйста, поделитесь и аплодируйте для поддержки новых статей.