我注意到在许多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()函数中看到引用或占位符。
答案 0 :(得分:2)
basic_deadline_timer::async_wait
文档声明:
无论异步操作是否立即完成 或不,不会从此函数中调用该处理程序。 处理程序的调用将以相当于的方式执行 使用boost :: asio :: io_service :: post()。
这意味着将从内部io_service::run()
(在调用它的线程中)调用处理程序,因此异常将自动传播到用户代码,并且在Asio中不需要特殊处理。通常,为简单起见,样本不包括错误处理。
抱歉,我不知道为什么样本中未指定error_code
占位符。需要看一下Asio的来源。