2012-05-05 60 views
3

我有很多不同的線程(boost::thread_pool)到boost::asio::io_serviceio_service將調用將觸發async_read的函數,這將觸發另一個async_read,從中可以調用許多函數。這全部在兩個類中完成:從Server類生成的線程和從Client類調​​用的async_readBoost,異常,線程和異步,我應該如何處理它們?

提供了throwasync_read調用的那些函數(來自Client類),誰會得到catch這個異常? Server?如果是這樣,有沒有辦法忽略錯誤並恢復正常執行?

回答

3

您是否閱讀了Boost.Asio manual的這部分內容?

摘要: 「如果異常是從處理程序拋出,異常被允許通過任何其他線程的run(),run_one(),輪詢()或poll_one(投擲線程的調用)進行傳播。那些正在調用這些函數的任何函數都會受到影響然後,應用程序有責任捕獲例外。「

所以這取決於你有你的catch聲明。

UPDATE

通用的方式,例外的工作是在一個錯誤創建錯誤將throw異常的功能。任何調用函數都必須調用try工作器函數,並且catch是解決錯誤的異常。或者,您可以將捕獲到的異常(或任何其他異常)重新引發到鏈上更高的任何調用函數。

void some_function() 
{ 
    // do some work 

    if (error_occurred) 
     // don't know context, so pass the buck to calling function 
     throw std::exception; 
} 

void some_calling_function() 
{ 
    try { 
     some_function(); // could throw 
    } catch (std::exception& e) { 
     // do some error handling depending in context 
    } 
    // code will resume here 
} 
+2

請加什麼可以在這個鏈接找到一個總結,或者說解決了OP的問題代碼的例子:如果我保存此網頁和離線閱讀,你的答案是不值得的事情:X –

+0

@ MatthieuM。 OK,但是如果沒有OP的代碼,我該如何提供解決他的問題的代碼? – TemplateRex

+0

嗯,這是一個通用的指導方針,因此需要花費時間更新答案。 –