【问题标题】:Using Symfony HTTP client with try and catch使用带有 try and catch 的 Symfony HTTP 客户端
【发布时间】:2021-04-18 12:07:00
【问题描述】:

我在事件订阅者中使用 Symfony HTTP 客户端,并将超时设置为 0.1。问题是我希望代码在超过 0.1 秒的情况下跳过 HTTP 请求并且超时,同时不需要抛出错误/异常。我试过尝试捕捉,但它不起作用。

public function checkToken()
{

    try {
        $response = $this->client->request('POST','url/of/api', [
            'json' => ['token' => $_ENV['USER_TOKEN']],
            'timeout' => 0.1,
        ]);
    }catch (\Exception $e){

    }

}

为什么不能通过try and catch处理?

【问题讨论】:

  • 您是否可以改用max_duration
  • @Cerad 抛出异常,也无法通过 try 和 catch 处理
  • 好的。这也许就是为什么“它不起作用”并不总是对问题的有用描述。所以它抛出了一个异常,但你的 try/catch 没有捕捉到它。也许 Laravel 以某种方式拦截了它?只是一个猜测。祝你好运。

标签: php symfony try-catch symfony5


【解决方案1】:

这是因为 Symfony 中的响应是惰性的。 正如本文件所述: https://symfony.com/doc/current/http_client.html#handling-exceptions

解决方法是在 try 部分调用 getContent 方法。

private $client;
private $user_data;

public function __construct(HttpClientInterface $client)
{

    $this->client = $client;
}


public function checkToken(RequestEvent $event)
{

    try {
        $response = $this->client->request('POST', 'url/of/api', [
            'json' => ['token' => $_ENV['USER_TOKEN']],
            'timeout' => 0.1,
        ]);
        $this->user_data =  $response->getContent();

    } catch (\Exception $e) {
        echo $e->getMessage();
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多