2011-09-30 14 views
7

मैं boost::system::error_code संकेत भेजना चाहता हूं कि कोई मेजबान/सेवा हल हो सकती है या नहीं। होस्ट/सेवा लुकअप विफल होने के कई कारण हो सकते हैं (उदा। नेटवर्क कनेक्शन समस्याएं या अमान्य तर्क)।'boost :: system :: error_code` मान प्रदान किया जाना चाहिए जब `boost :: asio :: ip :: tcp :: resolver :: resol()` विफल रहता है?

वापस क्या किया जाना चाहिए?

उत्तर

2

यह अधिकार resolve() से बाहर करना असंभव है। लेकिन तुम भार के कि बाहर पैरामीटर के रूप में एक error_code& लेता है में से एक का उपयोग करके इसे, आप के लिए यह करने के लिए प्राप्त कर सकते हैं:

और फिर error_code त्रुटि लौट यह सेट। मुझे भरोसा है कि यह उचित रूप से errno या h_errno को लपेट देगा।

5

error_code ऑब्जेक्ट बनाने के लिए आपको त्रुटि कोड और श्रेणी के साथ आना होगा। यहाँ एक उदाहरण है, कि त्रुटि मानते हुए एक और मेजबान से इनकार कर कनेक्शन की वजह से है:

error_code ec (errc::connection_refused, system_category()); 
return ec; 

तुम भी जब सिस्टम श्रेणी का उपयोग कर त्रुटि कोड के रूप में errno मूल्य पारित कर सकते हैं। उदाहरण के लिए:

#include <fstream> 
#include <cerrno> 
#include <boost/system/system_error.hpp> 

void foo() 
{ 
    ifstream file ("test.txt"); 
    if (!file.is_open()) 
    { 
     int err_code = errno; 
     boost::system::error_code ec (err_code 
      , boost::system::system_category()); 
     throw boost::system::system_error (ec, "cannot open file"); 
    } 
} 

दुर्भाग्य से, इस पुस्तकालय खराब documented है, इसलिए मैं header files में देखना बातें पता लगाने की सिफारिश कर सकते हैं आप। कोड काफी सरल और सीधे आगे है।

बस यदि आपका कंपाइलर सी ++ 11 का समर्थन करता है और आप इसका उपयोग करने के इच्छुक हैं, तो इस कार्यक्षमता ने इसे मानक बना दिया है। जहां तक ​​मुझे पता है कि जीसीसी 4.6.1 में यह पहले से ही है। यहाँ एक सरल उदाहरण है:

#include <cerrno> 
#include <system_error> 

std::error_code 
SystemError::getLastError() 
{ 
    int err_code = errno; 
    return std::error_code (err_code, std::system_category()); 
} 

void foo() 
{ 
    throw std::system_error (getLastError(), "something went wrong"); 
} 

आम तौर पर, पुस्तकालयों के आसपास error_code वस्तु पारित अगर वहाँ फेंक और system_error का उपयोग एक अपवाद सिस्टम विफलता का वर्णन फेंक करने की कोई जरूरत नहीं है। बिना किसी अपवाद के error_code का उपयोग करने का एक अन्य कारण यह है कि जब आपको विभिन्न धागे में त्रुटि को सिग्नल करने की आवश्यकता होती है। लेकिन सी ++ 11 में a solution for propagating exceptions across threads है।

उम्मीद है कि यह मदद करता है!

संबंधित मुद्दे