我有我的應用程序的主迴路控制,我做啓動一個線程來處理ASIO工作如下:捕獲異常
void AsioThread::Run()
{
try
{
/*
* Start the working thread to io_service.run()
*/
boost::asio::io_service::work work(ioService);
boost::thread t(boost::bind(&boost::asio::io_service::run, &ioService));
t.detach();
while (true)
{
// Process stuff related to protocol, calling
// connect_async, send_async and receive_async
}
}
catch (std::runtime_error &ex)
{
std::cout << "ERROR IN FTP PROTOCOL: " << ex.what() << std::endl;
}
catch (...)
{
std::cout << "UNKNOWN EXCEPTION." << std::endl;
}
在異步操作,處理程序被調用,有時我也引發異常這些處理程序,如:
void AsioThread::ReceiveDataHandler(const boost::system::error_code& errorCode, std::size_t bytesTransferred)
{
std::cout << "Receive data handler called. " << bytesTransferred << " bytes received." << std::endl;
if (errorCode)
{
std::cout << "Error receiving data from server." << std::endl;
}
rxBufferSize = bytesTransferred;
/*
* Check for response
*/
std::string msg(rxBuffer);
if (msg.substr(0, 3) != "220")
throw std::runtime_error("Error connecting to FTP Server");
}
我的問題是,異步處理器(AsioThread::ReceiveDataHandler
)內拋出的異常不是由主處理循環try...catch
塊逮住在AsioThread::Run
。當然,這是因爲工作線程t
在另一個線程上,並且在運行時導致執行錯誤。
如何從分離的boost::asio::io_service::work
線程收到異常?我怎樣才能構建我的代碼來使這個邏輯起作用?
感謝您的幫助。
爲什麼你有一個單獨的
while (true)
事件循環?你可以使用asio事件循環來做所有事情?在那種情況下加入線程。如果可能會失效,請創建一個io_service :: work對象。 – Ralf我需要事件循環,因爲它可以用作網絡邏輯的狀態處理器...不能沒有它。 – Mendes
不知道我是否理解你,但通常在異步回調中處理協議狀態。這不需要有一個單獨的事件循環。例如,在async_connect之後的回調函數中,你將被連接等。事件處理程序開始下一個異步操作,例如async_connect處理程序也可以啓動讀取和寫入。 – Ralf