增强ASIO异常传播

时间:2016-11-04 16:43:03

标签: c++ boost-asio

我注意到在许多Boost ASIO示例中,正在对可能引发错误的函数进行调用,但是没有使用try / catch。例如,阻止UDP客户端示例here具有以下功能:

  void check_deadline()
  {
    // Check whether the deadline has passed. We compare the deadline against
    // the current time since a new asynchronous operation may have moved the
    // deadline before this actor had a chance to run.
    if (deadline_.expires_at() <= deadline_timer::traits_type::now())
    {
      // The deadline has passed. The outstanding asynchronous operation needs
      // to be cancelled so that the blocked receive() function will return.
      //
      // Please note that cancel() has portability issues on some versions of
      // Microsoft Windows, and it may be necessary to use close() instead.
      // Consult the documentation for cancel() for further information.
      socket_.cancel();

      // There is no longer an active deadline. The expiry is set to positive
      // infinity so that the actor takes no action until a new deadline is set.
      deadline_.expires_at(boost::posix_time::pos_infin);
    }

    // Put the actor back to sleep.
    deadline_.async_wait(boost::bind(&client::check_deadline, this));
  }

deadline_.expires_at(here)的文档声明此函数会抛出boost :: system :: system_error异常。

这是不是在这个例子中捕获的,因为它只是一个例子,或者从这样的调用抛出的异常通过调用run,run-one等传播?换句话说,使用try catch包含对io_service.run()的调用来处理这些类型的异常是否足够?

此外,我还注意到deadline_.async_wait文档here指出处理程序需要一个带有对boost :: system :: system_error :: error_code的引用的签名。我没有在check_deadline()函数中看到引用或占位符。

1 个答案:

答案 0 :(得分:2)

basic_deadline_timer::async_wait文档声明:

  

无论异步操作是否立即完成   或不,不会从此函数中调用该处理程序。   处理程序的调用将以相当于的方式执行   使用boost :: asio :: io_service :: post()。

这意味着将从内部io_service::run()(在调用它的线程中)调用处理程序,因此异常将自动传播到用户代码,并且在Asio中不需要特殊处理。通常,为简单起见,样本不包括错误处理。

抱歉,我不知道为什么样本中未指定error_code占位符。需要看一下Asio的来源。