Heim  >  Fragen und Antworten  >  Hauptteil

Guzzle-Ausnahmen abfangen

Ich versuche, Ausnahmen in einer Reihe von Tests abzufangen, die auf einer von mir entwickelten API ausgeführt werden, und ich verwende Guzzle, um API-Methoden zu nutzen. Ich habe den Test in einen Try/Catch-Block eingeschlossen, aber er löst immer noch einen nicht behandelten Ausnahmefehler aus. Das Hinzufügen eines Ereignis-Listeners, wie in der Dokumentation beschrieben, scheint nichts zu bewirken. Ich muss in der Lage sein, Antworten mit den HTTP-Codes 500, 401, 400 abzurufen, und zwar jede Antwort, die nicht 200 ist, denn wenn das nicht funktioniert, legt das System basierend auf dem Ergebnis des Anrufs den am besten geeigneten Code fest.

Aktuelles Codebeispiel

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;

    }

Selbst mit einem bestimmten Catch-Block, der den Ausnahmetyp auslöst, erhalte ich immer noch eine Rückgabe

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

Wie zu erwarten ist, wird die gesamte Ausführung auf der Seite gestoppt. Durch das Hinzufügen des BadResponseException-Catchs kann ich 404 korrekt abfangen, aber das scheint bei 500- oder 401-Antworten nicht zu funktionieren. Kann jemand vorschlagen, wo ich falsch liege?

P粉511749537P粉511749537312 Tage vor1000

Antworte allen(12)Ich werde antworten

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

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

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

    Antwort
    0
  • 尊渡假赌尊渡假赌尊渡假赌

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

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

    Antwort
    0
  • 尊渡假赌尊渡假赌尊渡假赌

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

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

    Antwort
    0
  • 尊渡假赌尊渡假赌尊渡假赌

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

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

    Antwort
    0
  • 尊渡假赌尊渡假赌尊渡假赌

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

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

    Antwort
    0
  • 尊渡假赌尊渡假赌尊渡假赌

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

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

    Antwort
    0
  • 尊渡假赌尊渡假赌尊渡假赌

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

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

    Antwort
    0
  • 尊渡假赌尊渡假赌尊渡假赌

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

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

    Antwort
    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]);

    Antwort
    0
  • 尊渡假赌尊渡假赌尊渡假赌

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

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

    Antwort
    0
  • StornierenAntwort