2010-06-18 20 views
9

dokumentacji Boost.Asio suggests the following exception handling pattern:Wyjątek obsługi w 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. 
    } 
} 

Problemem jest to, że kontekst wyjątkiem jest tracona w momencie, gdy jest obsługiwane. Na przykład, jeśli mam wiele sesji gniazd w danym io_service, nie wiem, który spowodował wyjątek.

Jaki byłby lepszy sposób obsługi wyjątków z asynchronicznych procedur obsługi bez zawijania ich w blokach try/catch?

Odpowiedz

14

Nie ma nic złego w wzorze zalecanym przez Boost.Asio. Powinieneś spakować wszystkie niezbędne informacje do obsługi wyjątku wraz z obiektem wyjątku. Jeśli użyjesz boost::exception (lub typu pochodnego) do obsługi wyjątków, możesz bardzo łatwo dołączyć metadane (w tym informacje o sesji), tworząc specjalizację boost::error_info i dołączając ją do obiektu wyjątku za pomocą operatora < <. Twój blok catch może następnie wyodrębnić te informacje za pomocą get_error_info.

Powiązane problemy