2010-06-18 3 views
9

Boost.Asio प्रलेखन suggests the following exception handling pattern में से निपटने:अपवाद 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. 
    } 
} 

इसके साथ समस्या यह है कि अपवाद के संदर्भ बिंदु पर खो दिया है जब यह संभाला जाता है। उदाहरण के लिए, यदि मेरे पास किसी दिए गए io_service में एकाधिक सॉकेट सत्र हैं, तो मुझे नहीं पता कि किसने अपवाद का कारण बना दिया।

क्या बिना उन्हें try/catch ब्लॉकों में लपेटकर अतुल्यकालिक संचालकों से अपवाद को संभालने के लिए एक बेहतर तरीका हो सकता है?

उत्तर

14

Boost.Asio द्वारा अनुशंसित पैटर्न के साथ कुछ भी गलत नहीं है। आपको अपवाद वस्तु के साथ अपवाद को संभालने के लिए किसी भी आवश्यक जानकारी को पैकेज करना चाहिए। यदि आप अपने अपवाद हैंडलिंग के लिए boost::exception (या उससे प्राप्त एक प्रकार) का उपयोग करते हैं, तो आप boost::error_info का विशेषज्ञता बनाकर और ऑपरेटर < < का उपयोग करके अपवाद ऑब्जेक्ट को जोड़कर मेटाडेटा (सत्र जानकारी सहित) को आसानी से संलग्न कर सकते हैं। आपका कैच ब्लॉक get_error_info के साथ इस जानकारी को निकाल सकता है।