socket_t::send 函数示例返回一个布尔值以指示消息是否发送成功,但我从未见过任何检查此返回值的示例代码。
根据0MQ C++ API C 错误转换为异常:
底层 ØMQ C 库函数报告的所有错误都会通过 C++ 语言绑定自动转换为异常。zmq::error_t 类派生自 std::exception 类,并使用 zmq_strerror() 函数将错误代码转换为人类可读的字符串。
是否需要检查 send 的返回值?是否存在 send 函数会返回 false 但不抛出异常的情况?
socket_t::send 函数示例返回一个布尔值以指示消息是否发送成功,但我从未见过任何检查此返回值的示例代码。
根据0MQ C++ API C 错误转换为异常:
底层 ØMQ C 库函数报告的所有错误都会通过 C++ 语言绑定自动转换为异常。zmq::error_t 类派生自 std::exception 类,并使用 zmq_strerror() 函数将错误代码转换为人类可读的字符串。
是否需要检查 send 的返回值?是否存在 send 函数会返回 false 但不抛出异常的情况?
从源代码:
inline bool send (message_t &msg_, int flags_ = 0)
{
int rc = zmq_send (ptr, &msg_, flags_);
if (rc == 0)
return true;
if (rc == -1 && zmq_errno () == EAGAIN)
return false;
throw error_t ();
}
所以答案就在那里——如果zmq_send将错误设置为 EAGAIN,则 send 将返回 false。要了解何时会发生这种情况,请阅读 zmq_socket 和 zmq_setsockopt 的文档。
如果您使用的套接字可能引发 EAGAIN,并且您想要处理这种情况,您应该检查返回值。例如,您可以通过将消息排队并稍后重试来处理它。