2010-06-18 7 views
9

Documentation Boost.Asio suggests the following exception handling pattern:Gestion des exceptions dans 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. 
    } 
} 

Le problème est que le contexte d'exception est perdue au moment où il est traité. Par exemple, si j'ai plusieurs sessions socket dans un io_service donné, je ne sais pas lequel a causé l'exception.

Quelle serait une meilleure façon de gérer les exceptions des gestionnaires asynchrones sans les enveloppant dans try/catch blocs?

Répondre

14

Il n'y a aucun problème avec le modèle recommandé par Boost.Asio. Ce que vous devez faire est de regrouper toutes les informations nécessaires pour gérer l'exception avec l'objet d'exception. Si vous utilisez boost::exception (ou un type dérivé) pour gérer vos exceptions, vous pouvez très facilement joindre des métadonnées (y compris des informations de session) en créant une spécialisation boost::error_info et en l'associant à l'objet d'exception à l'aide de l'opérateur < <. Votre bloc catch peut alors extraire cette information avec get_error_info.