2010-06-18 9 views
9

documentación Boost.Asio suggests the following exception handling pattern Excepción:manejo en 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. 
    } 
} 

El problema con esto es que el contexto de excepción se pierde en el punto cuando se maneja. Por ejemplo, si tengo varias sesiones de socket en un io_servicio dado, no sé cuál causó la excepción.

¿Cuál sería una mejor forma de manejar las excepciones de los controladores asincrónicos sin envolviéndolos en los bloques try/catch?

Respuesta

14

No hay nada de malo en el patrón recomendado por Boost.Asio. Lo que debe hacer es empaquetar cualquier información necesaria para manejar la excepción junto con el objeto de excepción. Si usa boost::exception (o un tipo derivado de ella) para el manejo de excepciones, puede adjuntar fácilmente metadatos (incluida la información de sesión) creando una especialización de boost::error_info y adjuntándola al objeto de excepción utilizando el operador < <. Su bloque catch puede extraer esta información con get_error_info.