2014-05-18 63 views
0

我正嘗試使用php套接字爲個人項目創建一個庫。爲此,我開始使用phpUnit,學習並編寫(或多或少)定性庫。使用PhpUnit以正確的方法處理異常

當我在testConnection方法中沒有提供try/catch塊時,php給出連接超時的錯誤(這是正常的,因爲設備沒有連接)。但是php應該在下面的execute方法中處理異常,而不是在testConnection方法中。我似乎無法弄清楚這一點。

這是錯誤:

PHPUnit_Framework_Error_Warning : stream_socket_client(): unable to connect to tcp://x.x.x.x:* (A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.) 

識別TestClass用方法和try/catch不應該有:

public function testConnection() { 
    $adu = new Adu(); 
    $adu->setPort('AS0'); 
    $adu->setData('?'); 

    $command = new Command('x.x.x.x', *); 
    $command->setAduSent($adu); 

    try 
    { 
     $command->execute(); 
    } 
    catch (Exception $e) 
    { 
     echo $e->getMessage(); 
    } 
} 

這(執行方法)是其中異常應處理:

public function execute() 
{ 
    try { 
     $this->stream = $this->createStream($this->address, $this->port, $this->timeout); 
    } 
    catch(Exception $e) { 
     $this->logger->error('Exception (' . $e->getCode() . '): ' . $e->getMessage() . ' on line ' . $e->getLine(), $e); 
    } 

    $this->send($this->stream, $this->aduSent); 
    $this->aduReceived = $this->receive($this->stream); 
} 

private function createStream($address, $port, $timeout = 2) 
{ 
    $stream = stream_socket_client('tcp://' . $address . ':' . $port, $errorCode, $errorMessage, $timeout); 

    if(!$stream) { 
     throw new Exception('Failed to connect(' . $errorCode . '): ' . $errorMessage); 
    } 

    return $stream; 
} 

解決方案

因爲try/catch不會捕獲錯誤/警告,所以我必須抑制由stream_socket_client觸發的警告。然後檢查返回值是否爲false或流對象。如果爲false,則引發適當的異常。

$stream = @stream_socket_client('tcp://' . $address . ':' . $port, $errorCode, $errorMessage, $timeout); 

回答

0

stream_socket_client語句產生一個警告,而不是一個Exception,並且警告不會被try/catch塊捕獲。

但是PHPUnit會捕獲警告,並在這種情況下拋出異常,所以會觸發錯誤。您可以配置PHPUnit不要將警告視爲錯誤,但我不會推薦它。你的代碼應該是免費的警告。 PHPUnit docs

+0

Tnx的信息! 但我該如何避免這種警告?因爲需要牢記,連接無法建立。 除非我不使用stream_socket_client並從頭開始編寫套接字。並檢查是否有超時,然後自己拋出異常,如果可能的話。 – user2239584

+0

https://stackoverflow.com/a/19116605/2107145 這個答案有一個工作解決方案 –