首页  >  问答  >  正文

捕获Guzzle的异常

我正在尝试捕获在我正在开发的 API 上运行的一组测试中的异常,并且我正在使用 Guzzle 来使用 API 方法。我已经将测试包装在 try/catch 块中,但它仍然抛出未处理的异常错误。按照他们的文档中的描述添加事件监 听器似乎没有做任何事情。我需要能够检索 HTTP 代码为 500、401、400 的响应,实际上任何不是 200 的响应,因为如果不起作用,系统将根据调用结果设置最合适的代码.

当前代码示例

foreach($tests as $test){

        $client = new Client($api_url);
        $client->getEventDispatcher()->addLi stener('request.error', function(Event $event) {        

            if ($event['response']->getStatusCode() == 401) {
                $newResponse = new Response($event['response']->getStatusCode());
                $event['response'] = $newResponse;
                $event->stopPropagation();
            }            
        });

        try {

            $client->setDefaultOption('query', $query_string);
            $request = $client->get($api_version . $test['method'], array(), isset($test['query'])?$test['query']:array());


          // Do something with Guzzle.
            $response = $request->send();   
            displayTest($request, $response);
        }
        catch (GuzzleHttpExceptionClientErrorResponseException $e) {

            $req = $e->getRequest();
            $resp =$e->getResponse();
            displayTest($req,$resp);
        }
        catch (GuzzleHttpExceptionServerErrorResponseException $e) {

            $req = $e->getRequest();
            $resp =$e->getResponse();
            displayTest($req,$resp);
        }
        catch (GuzzleHttpExceptionBadResponseException $e) {

            $req = $e->getRequest();
            $resp =$e->getResponse();
            displayTest($req,$resp);
        }
        catch( Exception $e){
            echo "AGH!";
        }

        unset($client);
        $client=null;

    }

即使使用抛出异常类型的特定 catch 块,我仍然会返回

Fatal error: Uncaught exception 'GuzzleHttpExceptionClientErrorResponseException' with message 'Client error response [status code] 401 [reason phrase] Unauthorized [url]

如您所料,页面上的所有执行都会停止。添加 BadResponseException 捕获允许我正确捕获 404,但这似乎不适用于 500 或 401 响应。谁能建议我哪里出错了。

P粉511749537P粉511749537312 天前1006

全部回复(12)我来回复

  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:15:06

    三大改造***工资电饭锅三大改造***工资电饭锅三大改造***工资电饭锅三大改造***工资电饭锅三大改造***工资电饭锅三大改造***工资电饭锅

    回复
    0
  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:14:13

    阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀

    回复
    0
  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:13:10

    阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀阿帆VS啊打工仔手动蝶阀

    回复
    0
  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:12:11

    艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅

    回复
    0
  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:11:23

    艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅

    回复
    0
  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:10:26

    艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅

    回复
    0
  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:08:15

    艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅艾师傅

    回复
    0
  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:06:56

    阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是

    回复
    0
  • P粉701491897

    P粉7014918972023-11-17 14:08:04

    根据您的项目,可能需要禁用 guzzle 异常。有时编码规则不允许流量控制出现异常。您可以为 Guzzle 3 禁用例外,如下所示:

    $client = new \Guzzle\Http\Client($httpBase, array(
      'request.options' => array(
         'exceptions' => false,
       )
    ));

    这不会禁用诸如超时之类的curl异常,但现在您可以轻松获取每个状态代码:

    $request = $client->get($uri);
    $response = $request->send();
    $statuscode = $response->getStatusCode();

    要检查您是否获得了有效的代码,您可以使用如下内容:

    if ($statuscode > 300) {
      // Do some error handling
    }

    ...或者更好地处理所有预期的代码:

    if (200 === $statuscode) {
      // Do something
    }
    elseif (304 === $statuscode) {
      // Nothing to do
    }
    elseif (404 === $statuscode) {
      // Clean up DB or something like this
    }
    else {
      throw new MyException("Invalid response from api...");
    }

    适用于 Guzzle 5.3

    $client = new \GuzzleHttp\Client(['defaults' => [ 'exceptions' => false ]] );

    感谢@mika

    Guzzle 6

    $client = new \GuzzleHttp\Client(['http_errors' => false]);

    回复
    0
  • 尊渡假赌尊渡假赌尊渡假赌

    尊渡假赌尊渡假赌尊渡假赌2023-11-17 16:05:35

    阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是阿是

    回复
    0
  • 取消回复