2017-06-12 11 views
1

boost::asio::io_service::run()は、エラーの場合はboost::system::system_error例外をスローします。私はこの例外を処理する必要がありますか?もしそうなら、どうですか?boost :: asio :: io_service :: run()によってスローされた例外をキャッチする必要がありますか?

main() 
{ 
    boost::asio::io_service queue; 
    boost::asio::io_service::work work(queue); 
    { 
     // set some handlers... 
     **queue.run();** 
    } 
    // join some workers... 
    return 0; 
} 
+0

は、それはすべてが依存です。あなたがそれから回復できますか?例外をキャッチする方法も知っていますか? – NathanOliver

+0

@ NathanOliver非同期設定では、特に、多くのフローの1つの例外が多重化サービス全体を停止するかどうかを知ることです。 90%の症例では、それは望ましくない。プロクターモデルでは通常の制御フローは適用されません – sehe

答えて

4

はい:

私のmain.cppをコードは次のようなものです。

完了ハンドラからスローされた例外が伝播されることが記載されています。したがって、アプリケーションに応じて適切に処理する必要があります。

多くの場合、これはエラーなしで終了するまでループして、run()を繰り返すことになります。私は

static void m_asio_event_loop(boost::asio::io_service& svc, std::string name) { 
    // http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.effect_of_exceptions_thrown_from_handlers 
    for (;;) { 
     try { 
      svc.run(); 
      break; // exited normally 
     } catch (std::exception const &e) { 
      logger.log(LOG_ERR) << "[eventloop] An unexpected error occurred running " << name << " task: " << e.what(); 
     } catch (...) { 
      logger.log(LOG_ERR) << "[eventloop] An unexpected error occurred running " << name << " task"; 
     } 
    } 
} 

のようなものを持っている私たちのコードベースで

ここでドキュメントのリンクhttp://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.effect_of_exceptions_thrown_from_handlers

+0

コードサンプルとドキュメントのリンクが追加されました – sehe

関連する問題