2014-10-28 241 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(); 

如果您提供了更多關於您想達到的內容的信息,我們可能會爲您提供更多幫助。