[英]Should the exception thrown by boost::asio::io_service::run() be caught?
[英]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:根據我的理解,現在不可捕獲的異常可能是因為太多數據通過套接字發送得太快。 不過不確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.