处理程序失败后该怎么办?

时间:2013-04-12 14:34:29

标签: c++ asynchronous handler boost-asio

当读取操作处理程序返回错误时,表示连接已断开/失败/关闭? 启动另一个异步操作是否有意义?

我的意思是,根据不同的可能错误,诡辩可能会非常复杂。

void ReadHandler(const boost::system::error_code& error, size_t bytes_transferred)
{
   if(!error)
   {
      // OK
   }
   else
   {
      // does it make any sense to continue and start another async operation ?
      // or I have to check the error with error.value() and possibly close
      // the session or stop reading...etc ?
   }

我如何知道连接是否仍然可用?当下面的TCP层出现读取错误时,是因为连接中出现了什么问题?

2 个答案:

答案 0 :(得分:0)

理解错误本身可能有一些价值。但另一方面,除非你有一个全面的列表“哪些错误可以继续,哪些不行”,否则你最终会采用“最好的猜测”方法。

几乎可以肯定,一些错误是可以恢复的 - 暂时没有足够的缓冲空间来接收数据包,或者其他一些错误。其他错误是永久性的(有人拔掉了网络交换机的电源......)。

解决这个问题的一种方法是计算一个行中有多少错误 - 如果你继续并且没有得到另一个错误,那么很好......如果你得到三个(或五个或十个或者100)连续出错,退出,因为事情可能没有好转

另一种方法是在给定时间内允许这么多错误(例如,10秒内超过5个错误,或者一分钟内超过50个错误,或者对您的应用程序有任何意义)。

第三种方法是询问用户 - 这实际上取决于用户的级别,他/她将做什么给出“得到错误X,你想继续吗?”(是)|(否) “类型问题。

问题的很大一部分当然是“你的应用程序在做什么,以及在错误处理方面'弄错'的后果是什么?” - 如果不了解更多项目,我们无法真正回答 - 实际上,这可能超出了本网站的指导方针。

答案 1 :(得分:0)

它实际上取决于应用程序,甚至是异步操作,当使用非零错误调用处理程序时您会执行的操作。在大多数应用程序中,我通常以不同于其他错误的方式处理boost::asio::error::operation_aborted,因为这意味着程序正在关闭。根据协议,您可能希望以不同的方式解释boost::asio::error::eof。套接字可能完全适用,恕不另行通知。

相关问题