从C++函数返回空字符串

4

string receiveFromServer();

这个函数返回从某个服务器接收到的字符串。如果在传输过程中(包括协议)出现错误,我希望返回一个空字符串。然而,在C++中这种方法行不通(与Java不同)。我尝试过:

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

但这并不合法。

由于返回一个空字符串也是合法的,那么我可以返回什么来表示错误?

谢谢!


没有收到响应是一种错误,还是只是数据流的结束(预期和正常,但不同)? - GManNickG
5个回答

9
您可以抛出异常来表示错误。
try {
    std::string response = receiveFromServer();
} catch(std::runtime_error & e) {
    std::cerr << e.what();
}

然后你需要在receiveFromServer()中的某个地方加入throw std::runtime_error("Error receive response")

通常被认为是良好的实践(尽管有些人可能不同意)创建自己的异常类,这些类派生自std::runtime_error,以便客户端可以专门捕获您的错误。


好建议,但为什么使用 runtime_error?我更喜欢我的自定义异常类型继承自 std::exception(或其派生类之一)。 - BЈовић

5
你可以选择抛出异常(更好的方式),或返回boost :: optional<string>,但这样你必须检查返回值是否有效(实际上更糟糕)。

你可以使用 std::pair<string, bool> 替代 boost::optional - Björn Pollex
1
我本来想点赞的,直到你说它更糟糕。那怎么会更糟糕呢?这正是我会做的事情(事实上,我本来要提交一个答案来展示如何做,但先检查了其他人的答案)。 - GManNickG
@GMan 在C++中,应该使用异常来处理错误。检查返回值是用于C语言的。通过使用异常,您正在使用一个隐藏的通道来处理错误,使代码更易读。但是你已经知道这个了,对吧? :) - BЈовић
1
@VJo:我在问题上提出了一个澄清的评论,但是我心里(实际上并不一定)认为到达数据流的末尾不是一种错误,只是一种不同的结果。如果它确实是一个错误,那么它应该是一个异常,但如果返回空值是正常行为,那么optional就是正确的方式。 - GManNickG
@GMan 但问题说明它是一个错误。对于错误,应该抛出异常。因此,从函数返回任何内容实际上更糟糕,因为您必须检查函数的结果。 - BЈовић
@VJo:是的,如果这是一个错误,我们已经达成了共识。我正在探究OP是否真的采取这种行动是最好的选择。 - GManNickG

1

或许你应该尝试使用异常处理 with exceptions

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

1

NULL只有在使用指针时才有意义。在Java中,字符串是指针,因此您可以这样做。

在C++中,如果返回std::string,则必须存在。因此您有一些可能性:

  • 抛出异常
  • 返回一个带有表明成功的布尔值的pair
  • 返回空字符串
  • 使用指针(强烈不建议该选项)

0
如果您想返回一个空字符串,您也可以使用函数string::empty()来测试它是否为空。

1
我不知道问题是在你回答之后添加的,但是,“由于返回空字符串也是合法的,那么我可以返回什么来表示错误?” - Tony Delroy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接