2011-04-13 36 views
5

क्या यह जानने का कोई तरीका है कि निम्न में से कोई कॉल विफल होने पर कौन सी कुंजी शामिल थी?बूस्ट में गायब/गलत कुंजी का बेहतर प्रबंधन :: program_options

boost::program_options::variables_map vm; 
... 
int foo_bar = vm["some_key"].as<int>(); 

कुंजी के नक्शे से गायब है, या int करने के लिए परिवर्तनीय नहीं है, तो मैं एक नहीं बल्कि uninformative bad_any_cast मिलता है, और मैं के बाद किसी भी पता नहीं कर सकते हैं:

  • कुंजी शामिल
  • संग्रहीत मूल्य, या यहां तक ​​कि यदि यह वहां है।
  • प्रकार

मैं किसी भी समाधान है कि या तो बढ़ावा हैडर को संशोधित करने या try..catch ब्लॉक में ऊपर के लिए हर कॉल लपेटकर शामिल नहीं करता है की नहीं मिल सकता है शामिल किया गया। मुझे लगता है कि यह एक आम मुद्दा है, इसलिए शायद कोई और बेहतर दृष्टिकोण जानता है।

+3

मेरा मानना ​​है कि प्रलेखन में प्रदान किए गए नमूने आम तौर पर 'if (vm.count (" some_key ")! = 0) का उपयोग करके हर विकल्प की जांच करते हैं, ऐसा लगता है कि इसका उपयोग यह करने के लिए किया गया था। –

+0

प्रत्येक एकल कुंजी को जांचने के बाद आदर्श से कम है, हालांकि, मैं कम वर्बोज़ समाधान में उम्मीद कर रहा था। मैंने देखा कि बूस्ट के हाल के संस्करणों में एक "विकल्प" के रूप में एक विकल्प सेट कर सकता है, इस प्रकार कुंजी अनुपलब्ध होने पर अपवाद उठा सकता है। बेशक यह वैकल्पिक मूल्यों के लिए काम नहीं करेगा, और मुझे अभी भी अमान्य मानों को संभालने की समस्या है –

उत्तर

3

मार्को,

पुस्तकालय को संशोधित किए बिना बेहतर निदान पाने के लिए कोई तरीका नहीं है।

हालांकि, कृपया ध्यान दें कि सामान्य रूप से, मुझे यकीन नहीं है कि इस मामले में अपवाद बहुत विस्तृत होने चाहिए: - यदि आप चर का उपयोग करने के लिए गलत प्रकार का उपयोग करते हैं, तो आपको कोडिंग त्रुटि मिली है। आप इसे आसानी से डीबगर के साथ ट्रैक कर सकते हैं - यदि आप एक चर का उपयोग करते हैं जो मौजूद नहीं है, तो आपको या तो vm.count, या डिफ़ॉल्ट मान का उपयोग करने की आवश्यकता है। दोबारा, यह शायद एक कोडिंग त्रुटि है जो डीबगर का उपयोग करके हल किया जाता है।

मैं मानता हूँ कि bad_any_cast कुछ है कि सुधार किया जा सकता है, लेकिन यह है कि अपवाद है कि उपयोगकर्ता के लिए सूचित किया जा सकता यहाँ एक लक्ष्य होना चाहिए, जहां अपवाद त्रुटि कोडिंग का परिणाम है प्रतीत नहीं होता।

+0

आपके उत्तर के लिए धन्यवाद। असल में मैं इस धारणा के तहत था कि उपयोगकर्ता को किसी विकल्प के लिए गलत मान का उपयोग करने से bad_any_cast अपवाद फेंक देगा, लेकिन ऐसा नहीं है। तो हाँ, उस संबंध में यह एक कोडिंग त्रुटि होना चाहिए। फिर भी, मुझे लगता है कि एक लापता मूल्य को बेहतर तरीके से संभाला जा सकता है। –