C++ 处理程序失败后要做什么?

C++ 处理程序失败后要做什么?,c++,asynchronous,handler,boost-asio,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 cont

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

我的意思是,根据不同的可能错误,因果关系可能非常复杂

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层发生读取错误时,是因为连接中出现了真正的错误?

了解错误本身可能有一定的价值。但另一方面,除非你有一个“哪些错误可以继续,哪些错误不可以”的综合列表,否则无论如何,你最终会得到一个“最佳猜测”方法

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

解决此问题的一种方法是使用一个计数器来计算您在一行中得到的错误数-如果您继续并且没有得到另一个错误,那么很好。。。如果您连续出现三个(或五个、十个或100个)错误,您将退出,因为情况可能不会好转

另一种方法是在给定的时间内允许出现如此多的错误(例如,在10秒内出现5个以上的错误,或在一分钟内出现50个以上的错误,或任何对应用程序有意义的错误)

第三种方法是询问用户-这实际上取决于用户的级别,如果出现类似“Get error X,you Wave to continue?(Yes)|(No)”的消息,他/她会做什么


当然,问题的很大一部分是“你的应用程序在做什么,以及在错误处理方面“出错”的后果是什么?”——如果不了解更多你的项目,我们无法真正回答这个问题——事实上,这可能有点超出了网站指南要解决的范围

这实际上取决于应用程序,甚至是异步操作,当处理程序被非零错误调用时,您会做什么。在大多数应用程序中,我处理错误的方式通常不同于其他错误,因为这意味着程序正在关闭。根据协议的不同,您可能也希望进行不同的解释。在没有通知的情况下关闭套接字可能是完全合适的。

老实说,我没有考虑计数错误。这似乎是个好主意(如果第一个错误是“致命的”,则不确定如何关闭套接字,因为假定不会再次调用处理程序)