簡體   English   中英

無法從boost :: asio :: io_service :: run中捕獲異常

[英]Unable to catch exception from boost::asio::io_service::run

我在boost :: asio上有一個TCP服務器,它監聽連接並在獲取后開始使用boost :: asio :: write在循環中發送數據塊。

bool TcpServer::StartTcpServer(std::shared_ptr<boost::asio::io_service>  io_service)
{
    m_ioservice = io_service;
    m_acceptor.reset(new boost::asio::ip::tcp::acceptor(*m_ioservice, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), m_port)));
    m_socket = std::unique_ptr<boost::asio::ip::tcp::socket>(new boost::asio::ip::tcp::socket(*m_ioservice));

    m_socket->close();
    m_acceptor->async_accept(*m_socket, m_peer_endpoint,   boost::bind(&TcpServer::AcceptHandler, this, boost::asio::placeholders::error)); 

    m_io_thread.reset(new std::thread([this]{
    try
    {
        this->m_ioservice->run();
    }
    catch(const boost::system::system_error & err){print logs}
    catch(...){print another logs}
    }));
}

void TcpServer::AcceptHandler(const boost::system::error_code &ec)
{
    while(true)
    {
         try
         {
             boost::asio::write( *m_socket, boost::asio::buffer(data->c_str(), data->size()), boost::asio::transfer_all());  
         } 
         catch(const boost::system::system_error & err){print logs}
         catch(...){print another logs}
    }
}

如果我手動停止接收器,則會拋出並正確處理損壞管道的異常。 但有時會發生破裂的管道(我認為連接不良的原因),異常奇跡般地落在所有捕獲中並且應用程序終止:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'

檢查核心我發現它發生在boost :: asio :: write中,起源於io_service :: run()。 我究竟做錯了什么?

此外,我嘗試使用async_write重寫TCP服務器,但它仍然發生,但不是經常發生。

EDIT1:如果我手動停止接收器導致管道損壞,我會得到完全相同的異常和完全相同的callstack,但這個我可以處理。

EDIT2:根據我的理解,現在不可捕獲的異常可能是因為太多數據通過套接字發送得太快。 不過不確定。

terminate的錯誤消息實際上確實解釋了發生了什么。 boost::exception_detail::clone_impl失敗。 在不深入研究代碼的情況下,我假設它用於實現異常類的復制構造函數。 如果此復制構造函數在異常處理期間拋出異常,它將繞過異常塊,異常將向上傳播。 (即使您通過引用捕獲,仍可由編譯器創建副本。)

現在我不知道為什么復制構造函數失敗了; 知道問題還不夠。 但是這個與異步I / O有關的問題有一個非常類似的問題,而且關鍵是似乎是在異常處理之前, shared_ptr被銷毀了。 看起來很相

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM