我无法弄清楚如何从Guzzle future response处理程序中抛出异常.这是我的代码:
<?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";
Run Code Online (Sandbox Code Playgroud)
该catch块是从来没有在这种情况下达成.
在使用异步Guzzle请求时,您正在使用promises.使用a的then()函数FutureResponse将创建一个在请求完成时满足或拒绝的承诺.如果在发送时发生错误,则拒绝承诺,这意味着将调用提供给该then函数的第二个回调.请求成功完成后,将解析该请求,并调用提供给该then函数的第一个回调.当任何promise函数抛出异常时,异常会在promise内部被捕获并转发到链中的下一个错误处理程序.在您的示例中,如果请求成功,则抛出异常将触发错误回调.在错误回调中抛出异常会将异常转发到promise链中的下一个错误回调,或者默默地吃掉错误(在你的情况下,没有进一步的错误回调来触发).
Guzzle使用的React Promises库有更多关于promise的解析和拒绝转发的文档:https://github.com/reactphp/promise#how-promise-forwarding-works.这个库的作者正在考虑添加一个done()可以用作实际抛出未处理异常的终端承诺处理程序的函数.