[英]Boost Exception Handling with Boost ASIO
我打算在這個例子5A -它涵蓋了異常,並提升ASIO的例子的代碼在這里從該鏈接為快速參考粘貼處理
boost::mutex global_stream_lock;
void WorkerThread( boost::shared_ptr< boost::asio::io_service > io_service )
{
....
try
{
io_service->run();
}
catch( std::exception & ex )
{
....
}
}
void RaiseAnException( boost::shared_ptr< boost::asio::io_service > io_service )
{
io_service->post( boost::bind( &RaiseAnException, io_service ) );
throw( std::runtime_error( "Oops!" ) );
}
int main( int argc, char * argv[] )
{
boost::shared_ptr< boost::asio::io_service > io_service(
new boost::asio::io_service
);
boost::shared_ptr< boost::asio::io_service::work > work(
new boost::asio::io_service::work( *io_service )
);
boost::thread_group worker_threads;
for( int x = 0; x < 2; ++x )
{
worker_threads.create_thread( boost::bind( &WorkerThread, io_service ) );
}
io_service->post( boost::bind( &RaiseAnException, io_service ) );
worker_threads.join_all();
return 0;
}
我的問題是為什么這里沒有捕獲到異常? 為什么作者必須同時執行mechansims error code
和try-catch
才能捕獲這樣的異常
try
{
boost::system::error_code ec;
io_service->run( ec );
if( ec )
{
....
}
break;
}
catch( std::exception & ex )
{
....
}
我也聽不懂作者的意思
為了再次澄清我們是否將io_service用於用戶工作,如果工作可以生成異常,則必須使用異常處理。 如果我們僅將io_service用於boost :: asio函數,則可以使用異常處理或error變量,無論哪種情況都可以。 如果我們將io_service用於boost :: asio函數和用戶工作,則可以使用這兩種方法,也可以僅使用異常處理方法,但如果工作可以生成異常,則不僅可以使用錯誤變量。 這應該很容易理解。
如果有人可以澄清這一點,我將不勝感激
您引用的解釋有些誤導。
實際上, io_service
傳播從完成處理程序中逸出的所有異常,因此我們將其用於“用戶工作”還是用於“ asio函數”都沒有關系-在任何情況下,我們都可能希望處理從io_service::run
轉義的異常不僅std::exception
!)。 考慮以下示例:
void my_handler(const error_code&)
{
// this exception will escape from io_service::run()!
throw 0;
}
void setup_timer()
{
deadline_timer_.expires_from_now(seconds(5));
deadline_timer_.async_wait(my_handler);
}
io_service::run(error_code &ec)
和io_service::run()
之間的區別在於,如果ec
暗示錯誤,則后者故意引發異常。 從io_service.ipp
引用:
std::size_t io_service::run()
{
boost::system::error_code ec;
std::size_t s = impl_.run(ec);
boost::asio::detail::throw_error(ec);
return s;
}
因此,最重要的是,使用拋出重載就足夠了(並且可以選擇使用多個catch
處理程序來區分異常類型)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.