2014-10-28 244 views
4

我无法弄清楚如何从抛锚处理器中抛出一个异常。 这里是我的代码:GuzzleHttp异步请求异常

<?php 
require 'vendor/autoload.php'; 

$client = new \GuzzleHttp\Client(); 

$req = $client->createRequest('GET', 'http://www.google.com', array(
    'future' => true, 
)); 
echo "Sending request\n"; 
$response = $client->send($req); 

try { 
    $response->then(function ($data) { 
     echo "Response is received\n"; 
     throw new Exception('Test'); 
    })->then(function() { 
     // success handler 
    }, function (Exception $exception) { 
     echo "Error handler invoked\n"; 
     throw $exception; 
    }); 
} catch (Exception $e) { 
    echo "Exception catched\n"; 
} 
echo "Finish\n"; 

catch块是从来没有在这种情况下达成。

回答

6

使用异步Guzzle请求时,您正在使用promise。在FutureResponse之外使用then()函数将创建一个承诺,在请求完成时被履行或拒绝。如果发送时发生错误,则承诺被拒绝,这意味着调用提供给then函数的第二个回调函数。当请求成功完成时,它将被解析,并且调用提供给then函数的第一个回调函数。当在任何promise函数中抛出一个异常时,这个异常会被捕获并被转发给链中的下一个错误处理器。在你的例子中,如果请求成功,那么你抛出一个异常,它将触发错误回调。在错误回调中抛出异常会将异常转发到承诺链中的下一个错误回调,或者静静地吃掉错误(在您的情况下,没有更多的错误回调触发)。

Guzzle使用的React Promises库有更多关于承诺的解析和拒绝转发的文档:https://github.com/reactphp/promise#how-promise-forwarding-works。这个库的作者正在研究添加一个done()函数,该函数可以用作实际抛出未处理的异常的终端承诺处理程序。

+0

谢谢,现在很清楚。 – 2014-10-29 07:55:02

+0

@MichaelDowling是否GuzzleHttp \ Promises仍然吃例外? – 2016-12-30 09:02:57

0

异步意味着你的脚本不会等待响应从服务器回来,而只是发送请求并继续执行。在这种情况下,脚本在响应返回之前达到其生命的结束时间,因此不会执行任何回调。

在catch之后添加此行以阻止脚本的执行,直到响应返回。

$response->getStatusCode(); 

如果您提供了更多关于您想达到的内容的信息,我们可能会为您提供更多帮助。