在我提供的用于提升 asio 的处理程序中处理未处理异常(在提供给 recv 的回调中未处理)的正确方法是什么?
我的方法是这样的
while (true)
{
try
{
//create listener that takes my_io_service as param
my_io_service.run();
return; //normal way to cancel processing
}
//catches
//after catches:
lock_guard<mutex> _(running_mtx);
if ( ! my_io_service.stopped()) // one A pointed ! here is wrong
my_io_service.reset();
// and after this we go back to the beginning of the while loop :)
}
然后我像这样停止 my_io_service:
void stopListening()
{
lock_guard<mutex> _(running_mtx);
if ( ! my_io_service.stopped())
my_io_service.stop();
}
最佳答案
我不是很清楚你的意思。但据我了解,您想知道抛出的异常而不是传递给处理程序的错误代码,对吗?在这种情况下,try
和 catch
确实有效,但如果您只想确保不会出现 io_service.run()
的异常(而不是例如那些在处理程序中生成的),你也可以使用非抛出重载:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/io_service/run/overload2.html
boost::system::error_code ec;
my_io_service.run(ec);
现在您不会通过该行获得任何异常,但您可能应该在之后检查 ec
,因为通常会导致抛出异常的任何错误都将存储在那里。此 ec
与传递给您的处理程序的 error_code
无关,它指示异步操作的进行方式(而 .run
执行其操作作业),而如果 .run
本身遇到任何问题,则会设置此任务。
编辑:如果您关心处理程序中抛出的异常,您应该在其中放置一个 try catch
block ,以便根据需要处理它们。例如,您可能想要开始一个新的异步操作。
关于c++ - 在 boost asio 中处理未处理的异常并重新启动处理的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21308553/