Boost.Asio 调用返回了哪个 Boost 错误 codes/conditions?

Which Boost error codes/conditions are returned by which Boost.Asio calls?

我目前正在编写一个使用 Boost.Asio 作为基础套接字 API 的 TCP I/O 工具,并且我注意到 Boost.Asio似乎缺少关于每个单独操作 (例如 function/method 调用或异步操作)可能导致特定 Boost 错误 codes/conditions 的文档。我所能找到的只是错误代码 API 和一些非正式的错误代码列表,none 其中将特定代码与特定操作相关联

这种明显缺乏文档的情况令人沮丧,因为当您不知道可能的故障模式时,很难编写健壮的代码。甚至无法给出示例,因为由于缺乏文档,我什至不确定哪些操作会导致哪些问题。

相比之下,POSIX 套接字 API 在记录故障模式方面相当不错。特别是,它列出了每个函数调用可以生成的 errno 和 return 值。

这个 Boost.Asio 文档是否存在于某处,而我只是没有看到它?还是我应该只是猜测、逆向工程或收集有关 Boost.Asio API 各个部分的故障模式的经验数据,以便能够编写使用它的健壮代码?

一般来说,当Boost.Asio依赖于OS实现时,它既不会指定可能发生错误的条件,也不会指定可能返回的错误代码。失败时 Boost.Asio 将填充 boost::system::error_code 如果应用程序能够接收它,例如异步操作或使用 error_code 参数的同步操作重载;否则它将抛出包含 error_code 的异常。 documentation 声明如下:

Unless otherwise noted, when the behaviour of an asynchronous operation is defined "as if" implemented by a POSIX function, the handler will be invoked with a value of type error_code that corresponds to the failure condition described by POSIX for that function, if any. Otherwise the handler will be invoked with an implementation-defined error_code value that reflects the operating system error.

Asynchronous operations will not fail with an error condition that indicates interruption by a signal (POSIX EINTR). Asynchronous operations will not fail with any error condition associated with non-blocking operations (POSIX EWOULDBLOCK, EAGAIN or EINPROGRESS; Windows WSAEWOULDBLOCK or WSAEINPROGRESS).

如果错误处理取决于确切的错误代码,那么通常可以使用 BSD API mapping documentation to determine which OS calls are being made. One can then use the appropriate OS documentation to determine the conditions for which an error occurs and the values. The mapping between error codes and Boost.Asio error codes is located within asio/error.hpp,但映射通常相当简单。