Suraj
Suraj

Reputation: 2277

Catch exception from guzzle

I'm using laravel and I have setup the abstract class method to get response from the various APIs I'm calling. But if the API url is unreachable then it throws an exception. I know I'm missing something. Any help would be great for me.

$offers = [];
    try {
      $appUrl = parse_url($this->apiUrl);

      // Call Api using Guzzle
      $client = new Client('' . $appUrl['scheme'] . '://' . $appUrl['host'] . '' . $appUrl['path']);

      if ($appUrl['scheme'] == 'https') //If https then disable ssl certificate
        $client->setDefaultOption('verify', false);

      $request = $client->get('?' . $appUrl['query']);
      $response = $request->send();
      if ($response->getStatusCode() == 200) {
        $offers = json_decode($response->getBody(), true);
      }
    } catch (ClientErrorResponseException $e) {
      Log::info("Client error :" . $e->getResponse()->getBody(true));
    } catch (ServerErrorResponseException $e) {
      Log::info("Server error" . $e->getResponse()->getBody(true));
    } catch (BadResponseException $e) {
      Log::info("BadResponse error" . $e->getResponse()->getBody(true));
    } catch (\Exception $e) {
      Log::info("Err" . $e->getMessage());
    }

    return $offers;

Upvotes: 5

Views: 14640

Answers (4)

karmendra
karmendra

Reputation: 2243

These exceptions are not defined in guzzle officially.

These Exceptions are defined in AWS SDK for PHP.

For official Guzzle you may just do following.

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Exception\ClientException;

....
    try {
        $response = $this->client->request($method, $url, [
            'headers'     => $headers,
            'form_params' => $form_parameters,
        ]);
        $body = (string)$response->getBody();
    } catch (ClientException $e) {
        // Do some thing here...
    } catch (RequestException $e) {
        // Do some thing here...
    } catch (\Exception $e) {
        // Do some thing here...
    }

Upvotes: 3

Sadanand Masurkar
Sadanand Masurkar

Reputation: 11

you could create your own exception

class CustomException extends Exception { }

next you throws your own exception from abstract class guzzle exception

catch(ConnectException $ConnectException)
    {
        throw new CustomException("Api excception ConnectException",1001);

    }

and then handdle in in global exception handdler render methos

 if($exception instanceof CustomException)
       {

          dd($exception);

       }

Upvotes: 0

Eric Zhou
Eric Zhou

Reputation: 332

you should set the guzzehttp client with option 'http_errors' => false, the example code should be like this, document:guzzlehttp client http-error option explain

Set to false to disable throwing exceptions on an HTTP protocol errors (i.e., 4xx and 5xx responses). Exceptions are thrown by default when HTTP protocol errors are encountered.

$client->request('GET', '/status/500');
// Throws a GuzzleHttp\Exception\ServerException

$res = $client->request('GET', '/status/500', ['http_errors' => false]);
echo $res->getStatusCode();
// 500





$this->client = new Client([
    'cookies' => true,
    'headers' => $header_params,
    'base_uri' => $this->base_url,
    'http_errors' => false
]);

$response = $this->client->request('GET', '/');
if ($code = $response->getStatusCode() == 200) {
   try {
       // do danger dom things in here
   }catch (/Exception $e){
      //catch
   }

}

Upvotes: 9

Sigismund
Sigismund

Reputation: 1082

Not sure how you declared those exceptions and which Guzzle version are you using but in official documentation those exceptions don't exist.

In your case you are probally missing GuzzleHttp\Exception\ConnectException.

Upvotes: -1

Related Questions