【问题标题】:Why I get Fatal error: Uncaught exception 'GuzzleHttp\Exception\ClientException' with message 'Client error: 404'?为什么我收到致命错误:未捕获的异常 'GuzzleHttp\Exception\ClientException' 并带有消息'客户端错误:404'?
【发布时间】:2015-11-22 11:20:55
【问题描述】:

我尝试捕获异常,但我仍然收到“致命错误:未捕获的异常 'GuzzleHttp\Exception\ClientException' 并在 C:\OS\OpenServer\domains\kinopoisk\parser\php\vendor 中显示消息 'Client error: 404' \guzzlehttp\guzzle\src\Middleware.php:69"

 <?php

    ini_set('display_errors', 'on');
    error_reporting(E_ALL);
    set_time_limit(0);

    require "vendor/autoload.php";

    use GuzzleHttp\Client;
    use Psr\Http\Message\ResponseInterface;
    use GuzzleHttp\Exception\RequestException;
    use GuzzleHttp\Exception\ClientException;

    $filmsUrl = [297, 298];

    $urlIterator = new ArrayObject($filmsUrl);

    $client = new Client([
        'base_uri' => 'http://example.com',
        'cookies' => true,
    ]);

    foreach ($urlIterator->getIterator() as $key => $value) {
        try {
            $promise = $client->requestAsync('GET', 'post/' . $value, [
                'proxy' => [
                    'http'  => 'tcp://216.190.97.3:3128'
                ]
            ]);

            $promise->then(
                function (ResponseInterface $res) {
                    echo $res->getStatusCode() . "\n";
                },
                function (RequestException $e) {
                    echo $e->getMessage() . "\n";
                    echo $e->getRequest()->getMethod();
                }
            );
        } catch (ClientException $e) {
            echo $e->getMessage() . "\n";
            echo $e->getRequest()->getMethod();
        }
    }
    $promise->wait();

我的代码有什么问题?

【问题讨论】:

    标签: php guzzle guzzle6


    【解决方案1】:

    我不确定,但您只能在这里看到ClientException。也尝试抓住RequestException。看Middleware.php:69中的代码就是使用的异常类,但是如果要捕获所有异常,那么就需要去找最抽象的异常类,应该是 RuntimeExceptionGuzzleException

    试试这样的:

    try {
        // your code here
    } catch (RuntimeException $e) {
        // catches all kinds of RuntimeExceptions
        if ($e instanceof ClientException) {
            // catch your ClientExceptions
        } else if ($e instanceof RequestException) {
            // catch your RequestExceptions
        }
    }
    

    或者您可以尝试以下方法

    try {
        // your code here
    } catch (ClientException $e) {
        // catches all ClientExceptions
    } catch (RequestException $e) {
        // catches all RequestExceptions
    }
    

    希望对您有所帮助。

    【讨论】:

    • 感谢您的反馈,它帮助我了解我的错误在哪里。我想我不明白“$promise->wait()”=) 的真正含义是什么,因为当我在“foreach”中替换它时,一切都开始起作用了。此外,当我将 $promise->wait() 放入“try catch”时,它也可以工作。
    【解决方案2】:
    <?php
      
      //some code
      
      try {
        $promise->wait();
      } catch (RequestException $e) {
        echo $e->getMessage();
      }
    

    在guzzlehttp requestasync方法中,是在调用wait方法时发起HTTP请求,而不是在调用requestasync方法或then方法时发起。所以需要在wait方法中加入try catch

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2021-02-06
      • 2013-08-24
      • 2012-04-25
      • 2014-03-17
      • 2017-07-27
      相关资源
      最近更新 更多