D'intercepter les exceptions de Bouffer
Je suis en train d'essayer d'attraper les exceptions à partir d'un ensemble de tests, je suis en cours d'exécution sur une API je suis en développement et je suis en utilisant le Gave de consommer les méthodes de l'API. J'ai les tests enveloppé dans un bloc try/catch, mais il est encore de jeter exception non gérée erreurs. Ajouter un écouteur d'événements tels que décrits dans les docs ne semble pas faire quoi que ce soit. J'ai besoin d'être en mesure de récupérer les réponses qui ont HTTP codes de 500, 401, 400, en fait tout ce qui n'est pas 200 comme le système va le plus approprié code basé sur le résultat de l'appel, si cela ne fonctionne pas.
Actuel exemple de code
foreach($tests as $test){
$client = new Client($api_url);
$client->getEventDispatcher()->addListener('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 (Guzzle\Http\Exception\ClientErrorResponseException $e) {
$req = $e->getRequest();
$resp =$e->getResponse();
displayTest($req,$resp);
}
catch (Guzzle\Http\Exception\ServerErrorResponseException $e) {
$req = $e->getRequest();
$resp =$e->getResponse();
displayTest($req,$resp);
}
catch (Guzzle\Http\Exception\BadResponseException $e) {
$req = $e->getRequest();
$resp =$e->getResponse();
displayTest($req,$resp);
}
catch( Exception $e){
echo "AGH!";
}
unset($client);
$client=null;
}
Même avec le bloc catch pour la levée d'une exception de type je suis encore en train arrière
Fatal error: Uncaught exception 'Guzzle\Http\Exception\ClientErrorResponseException' with message 'Client error response [status code] 401 [reason phrase] Unauthorized [url]
et tous sur l'exécution de la page s'arrête, comme vous le souhaitez. L'ajout de la BadResponseException catch m'a permis de rattraper une erreur 404 correctement, mais cela ne semble pas fonctionner pour les 500 ou les réponses 401. Quelqu'un peut-il suggérer l'endroit où je vais mal s'il vous plaît.
- Est-ce code en vertu d'un espace de noms? Si donc, sauf si vous êtes
use
ing les exceptions, vous pouvez avoir besoin de les préfixer avec ` explicitement état de la FQ Classe. Ainsi, par exemple, '\Bouffer\Http\Exception\ClientErrorResponseException'
Vous devez vous connecter pour publier un commentaire.
Si l'Exception est levée dans ce
try
bloc puis au pire des casException
devrait être capte rien non interceptée.Considérer que la première partie de l'épreuve est de lancer l'Exception et étirable dans le
try
bloquer ainsi.En fonction de votre projet, la désactivation des exceptions pour bouffer pourrait être nécessaire. Parfois, les règles de codage de rejeter les exceptions pour le contrôle de flux. Vous pouvez désactiver les exceptions pour Bouffer 3 comme ceci:
Cela ne désactive pas curl exceptions pour quelque chose comme les délais d'attente, mais maintenant vous pouvez obtenir chaque code d'état facilement:
Pour vérifier, si vous avez obtenu un code d'accès valide, vous pouvez utiliser quelque chose comme ceci:
... ou mieux gérer tous les codes:
Pour Bouffer 5.3
Grâce à @mika
Pour Bouffer 6
break
😉 Mais bien sûr, il serait une bonne solution si vous avez plusieurs codes d'état, vous avez à gérer de la même manière. Je préfèreif
, cause switch prend en charge==
.request.options
. Résolu mon problème et m'a sauvé la recherche correctement. 🙂Pour attraper Bouffer les erreurs que vous pouvez faire quelque chose comme ceci:
... mais, pour être en mesure de "journal" ou "renvoyer" votre demande d'essayer quelque chose comme cela:
... ou si vous voulez "arrêter la propagation de l'évènement" vous pouvez overridde écouteur d'événement (avec une priorité plus élevée que -255) et tout simplement arrêter la propagation de l'évènement.
c'est une bonne idée pour éviter bouffer des erreurs comme:
dans votre application.
Dans mon cas, j'ai été jeter
Exception
sur un espace de noms de fichiers, de sorte php essayé d'attraperMy\Namespace\Exception
donc pas d'attraper toutes les exceptions à tout.La peine de vérifier si
catch (Exception $e)
est de trouver le bonException
classe.Juste essayer
catch (\Exception $e)
(avec qui\
là) et voir si cela fonctionne.Vous devez ajouter un paramètre supplémentaire avec http_errors => false
Vieille question, mais Bouffer ajoute la réponse à l'intérieur de l'objet de l'exception. Ainsi, une simple try-catch sur
GuzzleHttp\Exception\ClientException
et puis, à l'aide degetResponse
sur cette exception que pour voir ce niveau-400 erreur et continuer à partir de là.Je prenais
GuzzleHttp\Exception\BadResponseException
comme @dado suggère. Mais un jour je me suisGuzzleHttp\Exception\ConnectException
lorsque le DNS de domaine n'est pas disponible.Donc, ma suggestion est - catch
GuzzleHttp\Exception\ConnectException
pour être sûr de l'DNS ainsi des erreurs.