Как обрабатывать ошибки GuzzleHttp\Client с помощью конструкции try ... catch?

Как можно вывести ошибки на экран в методе `actionJson`, если дебаггер останавливается на втором выражении, а вся информация об ошибках записывается в `laravel.log`?
  • 17 сентября 2024 г. 14:03
Ответы на вопрос 1
В `GuzzleHttp\Client` можно обрабатывать ошибки с помощью конструкции `try...catch`, что позволяет поймать исключения, возникающие при выполнении HTTP-запросов. Ниже приведен пример использования этой конструкции, а также способ, как выводить ошибки на экран в методе `actionJson`.

Пример обработки ошибок в методе `actionJson`:

```php
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Http\JsonResponse;

public function actionJson(): JsonResponse
{
    $client = new Client();
    
    try {
        $response = $client->request('GET', 'https://api.example.com/data');
        $data = json_decode($response->getBody(), true);

        return response()->json($data);
    } catch (RequestException $e) {
        // Если вы хотите увидеть ошибку на экране
        $errorMessage = $e->getMessage();

        // Также можно записать информацию в лог
        \Log::error('GuzzleHttp Error: ' . $errorMessage);

        // Форматируем ответ с ошибкой для клиента
        return response()->json([
            'error' => 'Произошла ошибка при выполнении запроса.',
            'message' => $errorMessage // Можно убрать, если не хотите выводить подробности
        ], $e->getCode() ?: JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
    }
}
```

В этом примере, если возникает исключение при выполнении HTTP-запроса, оно будет поймано, и вы сможете обработать его. Вы можете записать информацию об ошибке в файл журнала Laravel с помощью `\Log::error()`, а также вернуть пользователю форматированный ответ с ошибкой.

### Объяснение компонентов кода:

1. **`try` блок** - здесь вы помещаете код, который может вызвать исключение.
2. **`catch (RequestException $e)`** - здесь вы перехватываете исключение, чтобы обработать его.
3. **`$e->getMessage()`** - вы получаете текстовое сообщение об ошибке, которое можно выводить на экран или логировать.
4. **`response()->json([...])`** - возвращает JSON-ответ клиенту с информацией об ошибке.
5. **`$e->getCode()`** - используется для получения кода состояния HTTP, чтобы установить соответствующий код ответа.

Этот подход позволяет вам как отладить проблему, так и предоставить более дружественный ответ пользователю, без раскрытия внутренней информации приложения.
Похожие вопросы