【问题标题】:Using boost::asio::write() boost::system::error_code never gets set使用 boost::asio::write() boost::system::error_code 永远不会被设置
【发布时间】:2011-04-18 21:54:33
【问题描述】:

当使用带有错误对象的 boost::asio::write() 变体时,错误不会被设置,而是会引发异常。也许我理解错了,你以为这个版本会设置错误,而不是抛出异常:

try{

    boost::system::error_code error;

    size_t iBytesWrit = boost::asio::write(
        *a_socket_ptr,boost::asio::buffer(a_response.getdata()),
        boost::asio::transfer_all(),
        error);

        (A)
        if(error)print error...


}
catch(std::exception &e){

    (B)
    log error...
}

如果我通过关闭套接字的客户端导致写入错误,则会引发异常 这里(发生了 B,而不是 A)。 boost::system::error_code 根本没有设置。我错过了什么愚蠢的事情?

这是 tcp 和同步的。

【问题讨论】:

  • 你得到的error_code是什么?

标签: c++ boost-asio


【解决方案1】:

write 上的文档说它会引发错误。您的代码中的问题是您将error 变量inside 声明为try。在文档中,它说错误变量设置为指示发生了什么错误。尝试在try 块之外声明error 变量。

编辑

经过一些cmets,没错。一些write 重载不会抛出。然后,这里的问题可能出在其他方面,例如缓冲区或套接字指针。看看你得到了什么确切的异常会很有趣。

【讨论】:

  • 我不认为error_code 的范围是这里的问题。 boost::asio::write 有几个重载不会引发错误,看来 OP 正在使用 correct one 给我。
  • 不明白为什么错误的范围在这里会有所不同。此外,这个版本并没有说它会抛出。它说:ec 设置以指示发生了什么错误,如果有的话
  • 我将错误变量移到了 try 之外。没有任何区别。 Diego Sevilla,如果您认为 error var scope 与它有关,您能解释一下原因吗?
  • @Sam,你是对的。我的错。 @Ty:范围只是能够在异常之后获取错误代码,因为我认为write 正在引发异常。然后,异常必须是由其他原因引起的,而不是写操作本身。你得到的确切异常是什么?
  • Diego,异常只是“传输端点未连接”,这是您期望在客户端过早断开连接时写入抛出的内容。问题不在于异常类型,而在于根本抛出了异常,并且没有设置错误。
【解决方案2】:

异常不是由 write() 引发的。稍后调用从端点(在客户端关闭/关闭套接字之后)获取远程 IP,这是抛出此问题的那个:传输端点未连接Exception Type: N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_6system12syst­em_errorEEEEE。所以这就是那个谜的结束,有点。仍然不知道为什么写入时不会设置错误...写入似乎没有失败。

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多