2010-06-18 58 views
9

Boost.Asio的文件suggests the following exception handling pattern處理:異常在Boost.Asio的

boost::asio::io_service io_service; 
... 
for (;;) 
{ 
    try 
    { 
    io_service.run(); 
    break; // run() exited normally 
    } 
    catch (my_exception& e) 
    { 
    // Deal with exception as appropriate. 
    } 
} 

它的問題是,當它處理的異常的情況下是在點丟失。例如,如果我在給定的io_service中有多個套接字會話,我不知道哪一個會導致異常。

什麼是更好的方式來處理來自異步處理程序的異常沒有將它們包裝在try/catch塊中?

回答

14

Boost.Asio推薦的模式沒有任何問題。你應該做的是打包處理異常的所有必要信息以及異常對象。如果您使用boost::exception(或從其衍生出的類型)進行異常處理,則可以通過創建boost::error_info專用化並使用運算符<將其附加到異常對象,非常輕鬆地附加元數據(包括會話信息)。然後你的catch塊可以用get_error_info提取這個信息。