我们应该如何实现std::error_code兼容的API

How should we implement std::error_code compatible API?

本文关键字:error code API std 何实现 实现 我们      更新时间:2023-10-16

假设我们正在编写一个库,并且我们希望对错误和异常提供细粒度控制:

void foo();
void foo(std::error_code&);

因此,我们将foo()实现为抛出std::system_error,并让foo(std::error_code&)捕获所有异常并提取error_code。

还是我们将foo(std::error_code&)实现为从不抛出函数,并根据错误代码的存在在foo()中抛出函数?

boost库与boost::system::error_code一起工作,但有例外,因此,我认为您可以定位于此库。例如boost::asio::basic_stream_socket::connect有两个版本

void connect(
    const endpoint_type & peer_endpoint);

boost::system::system_error失败时抛出。

boost::system::error_code connect(
    const endpoint_type & peer_endpoint,
    boost::system::error_code & ec);

ec设置为指示发生了什么错误(如果有的话)。

但我认为这也取决于foo的作用。

异常越少越好,所以应该使用第二个。