2011-06-06 16 views
6

के साथ कनेक्शन से इनकार करने के बाद कार्यक्रम से बाहर निकलने के लिए कैसे करें, फिलहाल, मैं टीसीपी के माध्यम से सर्वर से कनेक्ट करने के लिए बूस्ट एएसओ का उपयोग कर रहा हूं।बूस्ट एएसओ और सी/सी ++

मैं यह तय करने के लिए एक सशर्त केस का उपयोग करता हूं कि एप्लिकेशन को सर्वर से कनेक्शन शुरू करना है या नहीं; यह बहुत अच्छा काम करता है लेकिन समस्या यह है कि अगर मैं जब सर्वर डाउन तो आवेदन इस त्रुटि दे रही है दुर्घटना है सर्वर से कनेक्ट करने की कोशिश है:

case CONNECTION: 
// Connect to the server 
using boost::asio::ip::tcp; 
boost::asio::io_service io_service; 
tcp::resolver resolver(io_service); 
tcp::resolver::query query(tcp::v4(), server, boost::lexical_cast<string>(porta)); 
tcp::resolver::iterator iterator = resolver.resolve(query); 
tcp::socket s(io_service); 
s.connect(*iterator); 
:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' 
    what(): Connection refused 

इस कोड मैं का उपयोग कर रहा है

मैं अपने आवेदन को अपने सामान्य व्यवहार से ज़िंदा रखना चाहता हूं और केवल कनेक्शन के बारे में चेतावनी को विफल करना चाहता हूं।

मैं इस अपवाद को कैसे संभाल सकता हूं?

उत्तर

6

प्रलेखन here के अनुसार, connect विफलता पर boost::system::system_error फेंकता है। तो आपको try...catch ब्लॉक में अपने कोड को चारों ओर लपेटने और ऊपर उल्लिखित अपवाद को पकड़ने की आवश्यकता है। या यदि आप अपवादों का उपयोग नहीं करना चाहते हैं तो आप here वर्णित अन्य अधिभार का उपयोग कर सकते हैं जो त्रुटि पर त्रुटि कोड देता है।

+0

+1 त्रुटि को संभालने के दोनों तरीकों का उल्लेख करने के लिए +1। –

7

आपको try ... catch ब्लॉक का उपयोग करना चाहिए। वे इस तरह से काम करते हैं:

try 
{ 
    s.connect(*iterator); 
} 
catch (boost::system::system_error const& e) 
{ 
    std::cout << "Warning: could not connect : " << e.what() << std::endl; 
} 
+0

आप ** सब कुछ ** क्यों पकड़ना चाहते हैं जब आप केवल उम्मीद कर सकते हैं? – ereOn

+1

शायद एक खराब चुनिंदा उदाहरण है। यह आपके उत्तर से स्पष्ट नहीं है कि ओपी को 'बूस्ट :: सिस्टम :: system_error' पकड़ना चाहिए। आपके उत्तर को पढ़ने वाले शुरुआती लोगों को यह भी सोचना पड़ सकता है कि यह वास्तव में एक भयानक बात है, जबकि "सब कुछ पकड़ना" एक अच्छा अभ्यास है। – ereOn

+0

यदि आप सभी अपवादों को पकड़ते हैं तो आपने कैसे निर्णय लिया कि आप "कनेक्ट नहीं कर सकते"? हो सकता है कि आप "स्मृति आवंटित नहीं कर सके"? या "अमान्य स्मृति पता संदर्भित किया गया" या "अवैध अमान्य पैरामीटर पारित किया गया है (कहीं कुछ फ़ंक्शन में)"? –

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