我正嘗試使用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);
Tnx的信息! 但我該如何避免這種警告?因爲需要牢記,連接無法建立。 除非我不使用stream_socket_client並從頭開始編寫套接字。並檢查是否有超時,然後自己拋出異常,如果可能的話。 – user2239584
https://stackoverflow.com/a/19116605/2107145 這個答案有一個工作解決方案 –