के लिए मामलों का उपयोग करें हाल ही में मैं कुछ पुस्तकालयों को C++ 11 में <system_error>
सुविधाओं का उपयोग करने के लिए परिवर्तित कर रहा हूं।std :: error_code
मुझे std::error_code
बनाम std::error_condition
के उपयोग के मामलों को समझने में कठिनाई हो रही है।
नोट, मैं अंतर को समझता हूं - many questions on stackoverflow हैं जो अंतर पर जाते हैं।
मूल अंतर यह है कि std::error_code
को सिस्टम-या प्लेटफ़ॉर्म-विशिष्ट त्रुटि का प्रतिनिधित्व करना चाहिए, जबकि std::error_condition
एक सार त्रुटि है जो एक API या उपयोगकर्ता इंटरफ़ेस वापस आना चाहिए।
ठीक है - लेकिन मुझे समझ में समस्या आ रही है कि हम कभी भी अभ्यास में std::error_code
का उपयोग क्यों करेंगे। मुझे ऐसा लगता है कि आप या तो जा रहे हैं करने के लिए:
एक प्रणाली विशिष्ट त्रुटि रिपोर्टिंग तंत्र के साथ साथ
getsockopt
के लिए एक कॉल निपटने (जैसे , कहते हैं किerrno
या कुछ और एक POSIX कॉल से लौटे, या कहते हैं, हो सकता है लिनक्स परSO_ERROR
) जो आप आसानी सेstd::error_condition
परstd::errc
एनम्स के माध्यम से परिवर्तित कर सकते हैं, जिन्हें पोर्टेबल माना जाता है। जो भीstd::error_condition
के लिए एक उपयोग मामला होगा -त्रुटियों की एक प्रयोक्ता परिभाषित श्रेणी है, जो अनुप्रयोग स्तर या व्यापार-तर्क त्रुटियों का प्रतिनिधित्व, जैसे "अवैध सामाजिक सुरक्षा नंबर" या जो कुछ का उपयोग किया।
कुछ निम्न-स्तरीय इंटरफ़ेस या लाइब्रेरी से निपटें जो ओपनएसएसएल जैसी अपनी त्रुटि रिपोर्टिंग तंत्र को परिभाषित करता है, इस स्थिति में आप सीधे प्लेटफ़ॉर्म-विशिष्ट त्रुटि तंत्र का उपयोग करेंगे। इस मामले में आपको इन त्रुटियों को
std::error_code
में कनवर्ट या मैप करने की आवश्यकता होगी। लेकिन यदि आप इन प्लेटफ़ॉर्म विशिष्ट त्रुटियों कोstd::error_code
जैसी सामान्य चीज़ों में परिवर्तित करने की परेशानी से गुजरने जा रहे हैं, तो क्यों न केवलstd::error_condition
पर परिवर्तित करें?
इसके अतिरिक्त, क्योंकि POSIX प्रणाली त्रुटियों पोर्टेबल होना चाहिए रहे हैं, और के बाद से वे std::errc
enum के माध्यम से std::error_condition
के साथ एक-से-एक नक्शा, मैं std::error_code
के लिए किसी भी उपयोग के मामले नहीं मिल रहा। अधिकांश लिनक्स/यूनिक्स सिस्टम कॉल errno
सेट करता है, जिसे पोर्टेबल रूप से std::error_condition
पर मैप करना चाहिए।
तो, मुझे कहीं भी std::error_code
के लिए कोई उपयोग केस नहीं दिख रहा है। तो, कुछ उदाहरण उदाहरण क्या हैं जहां हम std::error_condition
के बजाय std::error_code
का उपयोग करना चाहते हैं?
के बारे में क्या [इस] (http://stackoverflow.com/a/16687434/560648) स्पष्ट नहीं है? –
@ लाइटनेसरेसेसिन ऑर्बिट, विचार स्पष्ट है - लेकिन मुझे अभ्यास में 'error_code' का उपयोग नहीं दिख रहा है। आपके द्वारा प्रदान किया गया लिंक कहता है: "प्रत्येक' std :: error_code' ऑब्जेक्ट में ऑपरेटिंग सिस्टम, या कुछ निम्न-स्तरीय इंटरफ़ेस से उत्पन्न त्रुटि कोड की एक जोड़ी होती है "- ठीक है, लेकिन ऑपरेटिंग सिस्टम या तो आपको एक POSIX त्रुटि देगा (जो पोर्टेबल है और इसे आसानी से 'std :: error_condition' में परिवर्तित किया जा सकता है) या किसी अन्य प्रकार की निम्न-स्तरीय त्रुटि (जैसे मुझे लगता है कि Win32 त्रुटि, उदाहरण के लिए), जिसे आपको मैन्युअल रूप से 'std :: error_code' - लेकिन त्रुटि_code पर मैपिंग का उपयोग क्या है? ... – Siler
... यदि आपको कुछ प्लेटफार्म विशिष्ट करने की ज़रूरत है, तो आप सीधे मंच सुविधाओं के साथ काम करते हैं। यदि आपको त्रुटि को और अधिक सामान्य में कनवर्ट करने की आवश्यकता है, तो आप error_condition का उपयोग करते हैं। मैं बस यह नहीं देखता कि error_code इनमें से किसी भी में फिट बैठता है। – Siler