在连接被拒绝时捕获 Guzzle 异常

时间:2021-02-19 12:15:34

标签: php laravel guzzle

我使用 Guzzle 和以下代码:

try {
    $client = new Client();
    $result = $client->get("http://{$request->ES_HOST}:{$request->ES_PORT}", [
            'headers' => ['Content-Type' => 'application/json'],
            'auth' => [$request->ES_LOGIN, $request->ES_PASSWORD],
            'allow_redirects' => false,
        ]);
    $response['status'] = $result->getStatusCode();
    $response['message'] = json_decode($result->getBody()->getContents());
} catch (RequestException $e) {
    $response['status'] = $e->getResponse()->getStatusCode();
    $response['message'] = $e->getMessage();
}

但是当用户提供错误的 URL 供 guzzle 处理它而不是在 RequestException 中被捕获时,它运行良好,它会在服务器中给出 500 错误并返回带有消息的常规 Exception cURL error 7: Failed to connect to [host] port [port]: Connection refused。我可以让它捕获错误和状态代码并返回给用户吗?

2 个答案:

答案 0 :(得分:2)

已经尝试过你的代码,它似乎抛出了一个 GuzzleHttp\Exception\ConnectException 的实例,所以将 catch 更改为

} catch (ConnectException $e) {
    $response['status'] = 'Connect Exception';
    $response['message'] = $e->getMessage();
}

( 添加适当的 use 语句...

use GuzzleHttp\Exception\ConnectException;

)

还注意到它没有 $e->getResponse()->getStatusCode(),这就是我将它设置为固定字符串的原因。

答案 1 :(得分:0)

由于 Guzzle 有这么多异常,我最终检查了 Guzzle 抛出了哪种类型的异常并相应地构建了响应:

try {
    $client = new Client();
    $result = $client->get("http://{$request->ES_HOST}:{$request->ES_PORT}", [
            'headers' => ['Content-Type' => 'application/json'],
            'auth' => [$request->ES_LOGIN, $request->ES_PASSWORD],
            'allow_redirects' => false,
        ]);
    $response['status'] = $result->getStatusCode();
    $response['message'] = json_decode($result->getBody()->getContents());
} catch (ConnectException $e) {
    $response['status'] = 404;
    $response['message'] = $e->getMessage();
} catch (RequestException $e) {
    $response['status'] = $e->getResponse()->getStatusCode();
    $response['message'] = $e->getMessage();
} catch (\Exception $e) {
    $response['status'] = 0;
    $response['message'] = $e->getMessage();
}
相关问题