我目前正在编写一个使用Boost.Asio作为底层套接字API的TCP I / O工具,并且我注意到 Boost.Asio似乎缺少哪些特定Boost错误代码/条件的文档可以由每个单独的操作(例如函数/方法调用或异步操作)产生。我能找到的所有内容都是错误代码API和一些非正式的错误代码列表,没有一项将特定代码与特定操作相关联。
这种明显缺乏文档令人沮丧,因为当您不了解可能的故障模式时,编写健壮的代码很困难。甚至不可能举例,因为我甚至不确定哪些操作可能因缺乏文档而导致哪些操作。
相比之下,POSIX套接字API在记录故障模式方面非常不错。特别是,它列出了每个函数调用可以生成的errno和返回值。
这个Boost.Asio文档是否存在于某处,我只是没有看到它?或者我应该猜测,反向工程或收集Boost.Asio API各个部分的故障模式的经验数据,以便能够编写使用它的健壮代码?
答案 0 :(得分:2)
通常,当Boost.Asio依赖于OS实现时,它既不会指定可能发生错误的条件,也不会指定可能返回的错误代码。失败时Boost.Asio将填充boost::system::error_code
如果应用程序能够接收它,例如异步操作或具有error_code
参数的同步操作重载;否则会抛出包含error_code
的异常。 documentation声明如下:
除非另有说明,否则定义异步操作的行为"好像"通过POSIX函数实现,将使用类型
error_code
的值调用处理程序,该值对应于POSIX针对该函数描述的失败条件(如果有)。否则,将使用反映操作系统错误的实现定义的error_code
值调用处理程序。异步操作不会因指示信号中断的错误条件(POSIX
EINTR
)而失败。异步操作不会因与非阻塞操作(POSIXEWOULDBLOCK
,EAGAIN
或EINPROGRESS
; WindowsWSAEWOULDBLOCK
或WSAEINPROGRESS
)相关的任何错误情况而失败。< / p>
如果错误处理取决于确切的错误代码,那么通常可以使用BSD API mapping documentation来确定正在进行的OS调用。然后,可以使用适当的OS文档来确定发生错误的条件和值。错误代码和Boost.Asio错误代码之间的映射位于asio/error.hpp
内,但映射通常非常简单。