2010-06-18 20 views
9

documentazione Boost.Asio suggests the following exception handling pattern Eccezione:manipolazione in 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. 
    } 
} 

Il problema è che il contesto d'eccezione si perde nel momento in cui è gestita. Ad esempio, se ho più sessioni socket in un dato io_service, non so quale abbia causato l'eccezione.

Quale sarebbe un modo migliore per gestire le eccezioni dai gestori asincroni senza inserendoli nei blocchi try/catch?

risposta

14

Non c'è niente di sbagliato con il modello consigliato da Boost.Asio. Quello che dovresti fare è impacchettare tutte le informazioni necessarie per gestire l'eccezione insieme all'oggetto eccezione. Se si utilizza boost::exception (o un tipo derivato da esso) per la gestione delle eccezioni, è possibile allegare facilmente i metadati (comprese le informazioni di sessione) creando una specializzazione di boost::error_info e allegandola all'oggetto eccezione utilizzando l'operatore < <. Il blocco catch può quindi estrarre queste informazioni con get_error_info.