Laravel - 无法处理 RequestException(Guzzle + MailChimp)

Laravel - Can't handle RequestException (Guzzle + MailChimp)

我正在尝试处理 404 请求异常。这是我第一次使用 Guzzle,所以如果没有错误提示,我将无法处理异常,我需要检查错误代码,因为在 mailchimp API 上,错误代码为我们提供了我们需要的信息需要。

相反,我收到了这个回应 - http://prntscr.com/db9ari

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Newsletter;
use GuzzleHttp\Client;

class NewsletterController extends Controller
{


    public function api()
    {

        $mailchimp = new Client(['base_uri' => 'https://us14.api.mailchimp.com/3.0/']);

        try {
            $checkEmail = $mailchimp->request('GET', 'lists/LIST-ID/members/' . md5('EMAIL), [ 'headers' => [ 'Authorization' => 'apikey ' . config('globals.mailchimp_key') ]]);
        }

        catch( RequestException $exception ) {

            if ($exception->getStatusCode() === 404)
            {
                return 'STRING THAT I WANT TO RETURN IN CASE OF ERROR';
            }
        }



    }
}

尝试使用这样的东西:

try {
    $checkEmail = $mailchimp->request('GET', 'lists/LIST-ID/members/' . md5('EMAIL), [ 'headers' => [ 'Authorization' => 'apikey ' . config('globals.mailchimp_key') ]]);
}catch( \Exception $e ) {
    if ($e instanceof GuzzleHttp\Exception\RequestException){
        if ($exception->getStatusCode() === 404)
        {   
            return 'STRING THAT I WANT TO RETURN IN CASE OF ERROR';
        }
    }else{
        // do anything else here
    }
}

根据 Guzzle documentation:

A GuzzleHttp\Exception\ClientException is thrown for 400 level errors if the http_errors request option is set to true

您可以通过以下两种方式之一解决此问题:

  • 实例化客户端时将 http_errors 值设置为 false。对于您的代码,这看起来像这样:$mailchimp = new Client(['base_uri' => 'https://us14.api.mailchimp.com/3.0/', 'http_errors' => false]);

  • 将您的呼叫包装在 try/catch 中并捕获 ClientException

Guzzle 也会对任何 500 级错误抛出 ServerException,您可以用同样的方式处理