По состоянию на 2019 год вот то, что я разработал на основе ответов выше и Guzzle docs чтобы обработать исключение, получите тело ответа, код состояния, сообщение и другие, иногда ценные элементы ответа.
try {
/**
* We use Guzzle to make an HTTP request somewhere in the
* following theMethodMayThrowException().
*/
$result = theMethodMayThrowException();
} catch (\GuzzleHttp\Exception\RequestException $e) {
/**
* Here we actually catch the instance of GuzzleHttp\Psr7\Response
* (find it in ./vendor/guzzlehttp/psr7/src/Response.php) with all
* its own and its 'Message' trait's methods. See more explanations below.
*
* So you can have: HTTP status code, message, headers and body.
* Just check the exception object has the response before.
*/
if ($e->hasResponse()) {
$response = $e->getResponse();
var_dump($response->getStatusCode()); // HTTP status code;
var_dump($response->getReasonPhrase()); // Response message;
var_dump((string) $response->getBody()); // Body, normally it is JSON;
var_dump(json_decode((string) $response->getBody())); // Body as the decoded JSON;
var_dump($response->getHeaders()); // Headers array;
var_dump($response->hasHeader('Content-Type')); // Is the header presented?
var_dump($response->getHeader('Content-Type')[0]); // Concrete header value;
}
}
// process $result etc. ...
Вуаля. Вы получаете информацию об ответе в виде удобно разделенных элементов.
Примечания на стороне:
С помощью предложения catch
мы перехватываем цепочку наследования корневого класса исключений PHP \Exception
, поскольку пользовательские исключения Guzzle расширяют его.
Этот подход может быть полезен для случаев, когда Guzzle используется под капотом, например, в Laravel или AWS API PHP SDK, поэтому вы не можете поймать подлинное исключение Guzzle.
В этом случае класс исключения может не совпадать с тем, который упоминается в документации Guzzle (например, GuzzleHttp\Exception\RequestException
в качестве корневого исключения для Guzzle).
Поэтому вам нужно поймать \Exception
, но имейте в виду, что это все еще экземпляр класса исключения Guzzle.
Хотя используйте с осторожностью. Эти оболочки могут сделать недоступными подлинные методы объекта Guzzle $e->getResponse()
. В этом случае вам нужно будет посмотреть фактический исходный код исключения оболочки и узнать, как получить статус, сообщение и т. Д. Вместо использования методов Guzzle $response
.
Если вы сами вызываете Guzzle, вы можете поймать GuzzleHttp\Exception\RequestException
или любой другой, упомянутый в их документах по исключениям в соответствии с условиями вашего варианта использования.
person
Valentine Shi
schedule
30.06.2019