首頁  >  問答  >  主體

捕獲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 天前998

全部回覆(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
  • 取消回覆