2011-05-27 47 views
4

string receiveFromServer();從函數C++

返回NULL字符串這個函數返回從一些服務器接收到的字符串。如果沿途(包括協議)出現錯誤,我想返回一個NULL字符串。但是,這不適用於c + +(不像java)。 我想:

string response = receiveFromServer(); 
if (response==NULL) { 
    cerr << "error recive response\n"; 
} 

,但它不是法律。 由於空字符串也是合法返回,我可以返回什麼,將指示錯誤?

謝謝!

+0

沒有收到一個響應*錯誤*,或只是數據流的結束(預期的和正常的,但不同的)? – GManNickG 2011-05-27 09:14:22

回答

9

您可以拋出異常來指示錯誤。

try { 
    std::string response = receiveFromServer(); 
} catch(std::runtime_error & e) { 
    std::cerr << e.what(); 
} 

那麼你就需要一個throw std::runtime_error("Error receive response")某處receiveFromServer()

它通常被認爲是良好的做法(儘管有些人可能不同意)創建自己的例外類,這些異常類源自std::runtime_error以使客戶端能夠專門捕獲錯誤。

+0

+1這是正確的方法! – 2011-05-27 09:12:21

+0

很好的建議,但爲什麼runtime_error?我更喜歡自己從std :: exception繼承的異常類型(或者它的一些派生) – 2011-05-27 09:12:42

+0

@VJo:我已經在編輯它了。 – 2011-05-27 09:13:10

1

NULL在使用指針時只有一個含義。在Java字符串是指針,所以你可以做到這一點。

在C++中,如果你返回一個std :: string,它必須存在。所以,你有一些possibilites

  • 拋出一個異常
  • 返回一個布爾一對指示成功
  • 返回一個空字符串
  • 使用指針(我強烈反對該選項)
5

你可以拋出一個異常(更好的方法),或者返回boost :: optional < string>,但是你必須檢查返回值是否有效(這實際上更糟糕)。

+0

而不是'boost :: optional',你也可以使用'std :: pair <字符串,布爾>'。 – 2011-05-27 09:12:46

+1

我要高舉,直到你說它變得更糟。情況如何更糟?這是我會做的(事實上,我將提交一個答案,顯示如何,但首先檢查他人)。 – GManNickG 2011-05-27 09:13:04

+0

@GMan在C++中,你應該使用異常來處理錯誤。檢查返回值是c。通過使用異常,您正在使用隱藏通道進行錯誤處理,使代碼更具可讀性。但是你已經知道了,對吧? :) – 2011-05-27 09:15:48

1

也許你應該嘗試處理with exceptions

try 
    { 
    string response = receiveFromServer(); 
    } 
    catch (...) 
    { 
    cerr << "error recive response\n"; 
    } 
0

如果你想返回一個空字符串,你也可以使用函數 string::empty(),以測試它是否是空的

+1

我不知道這個問題在你的回答後是否加了這個,但是......「由於空字符串也是合法返回的,我可以返回什麼來表示錯誤?」 – 2011-05-27 09:17:19