2

我目前正在编写一个使用 Boost.Asio 作为底层套接字 API 的 TCP I/O 工具,我注意到Boost.Asio 似乎缺乏关于每个单独操作可能导致哪些特定 Boost 错误代码/条件的文档(例如函数/方法调用或异步操作)。我能找到的只是错误代码 API 和一些非正式的错误代码列表,它们都没有将特定代码与特定操作相关联

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

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

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

4

1 回答 1

2

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

除非另有说明,否则当异步操作的行为被定义为“好像”由 POSIX 函数实现时,将使用与error_codePOSIX 为该函数描述的失败条件相对应的类型值调用处理程序(如果有)。error_code否则,将使用反映操作系统错误的实现定义的值调用处理程序。

异步操作不会因指示信号中断 (POSIX EINTR) 的错误条件而失败。异步操作不会因与非阻塞操作(POSIX或EWOULDBLOCK; Windows或)相关的任何错误条件而失败。EAGAINEINPROGRESSWSAEWOULDBLOCKWSAEINPROGRESS

如果错误处理依赖于确切的错误代码,那么通常可以使用BSD API 映射文档来确定正在执行哪些操作系统调用。然后可以使用适当的操作系统文档来确定发生错误的条件和值。错误代码和 Boost.Asio 错误代码之间的映射位于 内asio/error.hpp,但映射通常相当简单。

于 2015-07-27T21:48:17.243 回答