2012-02-10 14 views
11

मैं एक कॉलबैक फ़ंक्शन जो एक boost::asio::deadline_timer करने के लिए बाध्य कर रहा है। अब फ़ंक्शन को कॉल किया जाता है जब टाइमर रद्द हो जाता है या यह समाप्त हो जाता है। चूंकि मुझे इन दो मामलों के बीच अंतर करने की आवश्यकता है, इसलिए मुझे पास किए गए त्रुटि कोड की जांच करने की आवश्यकता है। बुनियादी कोड इस तरह होगा:उचित रूप से बूस्ट त्रुटि कोड का चयन कैसे करें?

void CameraCommand::handleTimeout(const boost::system::error_code& error) 
{ 
    std::cout << "\nError: " << error.message() << "\n"; 
    return; 
} 

अब जब हैंडलर क्योंकि टाइमर समाप्त हो गई त्रुटि कोड Success है कहा जाता है, जब टाइमर त्रुटि कोड को रद्द कर दिया है Operation canceled है।

अब मेरे सवाल होगा, कैसे उचित रूप से जाँच करने के लिए क्या हुआ?

सुझाव 1:

if(error.message() == "Success") 
{ 
    // Timer expired 
} 
else 
{ 
    // Timer cancelled 
} 

सुझाव 2:

if(error.value() == 0) 
{ 
    // Timer expired 
} 
else 
{ 
    // Timer cancelled 
} 

अब मेरे सवाल है - वहाँ byitself और मूल्य द्वारा स्ट्रिंग द्वारा या नहीं त्रुटि तुलना करने के लिए किसी भी तरह से है? की तरह कुछ (यह अब तक किया जाता है)

if (error == boost::system::error::types::success) 

क्योंकि मैं सिर्फ जांच है, जो मेरी राय में थोड़े अनावश्यक है के लिए एक स्ट्रिंग बनाने की जरूरत है कि क्या मैं पहला सुझाव के बारे में पसंद नहीं है है। दूसरी तरफ नुकसान है कि अगर मैं किसी और चीज की जांच करना चाहता हूं तो मुझे सभी त्रुटि कोड देखने की ज़रूरत है? तो वहाँ किसी भी enums या तरीके त्रुटि के लिए जाँच करने के लिए कर रहे हैं या मैं दोनों में से एक का सुझाव दिया है तरीके हैं?

उत्तर

18

documentation को देखते हुए,:

if (error) 
{ 
    // Timer has been cancelled - or some other error. If you just want information 
    // about the error then you can output the message() of the error. 
} 
else 
{ 
    ... 
} 

boost::error_code इस के लिए एक बूलियन ऑपरेटर है, यहाँ एक नजर है

switch(error.value()) 
{ 
    case boost::system::errc::success: 
    { 
    } 
    break; 

    case boost::system::errc::operation_canceled: 
    { 
     // Timer cancelled 
    } 
    break; 

    default: 
    { 
     // Assert unexpected case 
    } 
    break; 
} 
+0

ग्रेट - बिल्कुल जो मैं ढूंढ रहा था !!! धन्यवाद!!! – Toby

+0

हम्म, मुझे यह गलत हो सकता है। यह कहता है कि हमें error_codes की तुलना में error_codes की तुलना करनी चाहिए और तुलना के लिए मान() का उपयोग नहीं करना चाहिए। http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-2.html –

+0

यह गलत है। boost error_code में श्रेणियां और मान हैं। एक ही मूल्य एक से अधिक श्रेणियों में मौजूद हो सकता है। आपको दोनों को जांचना होगा। –

9

तुम सिर्फ एक बूलियन कलाकारों का उपयोग कर सकते हैं: आप enum मूल्यों का उपयोग कर सकते http://www.boost.org/doc/libs/1_48_0/libs/system/doc/reference.html#Class-error_code

+0

ठीक है, यह इस विशेष समस्या के लिए उपयुक्त होगा, क्योंकि मैं तो बस निर्धारित करने के लिए अगर यह रद्द कर दिया गया चाहते हैं या बस समाप्त हो गई है, क्या मतलब होगा 'if (! त्रुटि)', लेकिन कैसे एक विशेष त्रुटि के लिए जाँच करने के लिए? – Toby

+0

ध्यान देने योग्य एक बात यह है कि बूस्ट के प्रत्येक भाग में त्रुटि कोड का अपना सेट होगा। बाहर http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/error__basic_errors.html चेक – Nick

+0

IMHO 'अगर (error.value()! = बढ़ावा :: प्रणाली :: errc :: सफलता) 'अधिक सटीक, अधिक पठनीय है और ** बूलियन ऑपरेटर ओवरराइड कार्यान्वयन पर निर्भर नहीं है ** और इसलिए एक इंटरफेस के लिए प्रोग्राम किया गया है, कार्यान्वयन नहीं। –

2

आप कर सकते हैं एक डिफ़ॉल्ट का निर्माण error_code त्रुटि का उपयोग करें:

+०१२३५१६४१०६
if(error == boost::system::error_code()) 
संबंधित मुद्दे