2010-07-01 36 views
9

कहें कि आपके पास एक enum है जो एक त्रुटि कोड का प्रतिनिधित्व करता है। कई कोड होंगे, प्रत्येक के अपने अंतर्निहित int मूल्य के साथ; हालांकि, enum मान जो डिफ़ॉल्ट 0 मान प्राप्त करता है ऐसा लगता है कि इसे ध्यान से माना जाना चाहिए।सी #: क्या एनम का डिफ़ॉल्ट मान कोई नहीं होना चाहिए या अज्ञात होना चाहिए?

त्रुटि कोड enum के मामले में, दो विशेष मान हैं जिनके बारे में मैं सोच सकता हूं: कोई नहीं (मामलों में जब कोई त्रुटि नहीं है) और अज्ञात (उन मामलों के लिए जब कोई मौजूदा त्रुटि कोड उचित नहीं है, या शायद यहां तक ​​कि जब त्रुटि स्थिति का पता नहीं लगाया जा सकता है)।

इनमें से एक मान ऐसा लगता है कि इसे 0 प्राप्त करना चाहिए, जहां दूसरे को शायद कुछ और मिल जाएगा। क्या कोई भी मान 0 पर सेट नहीं करना है, या अज्ञात मान 0 पर सेट करना उचित है?

public enum ErrorCode 
{ 
    None = -1, 
    Unknown = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

मेरे वृत्ति मुझसे कहता है कि डिफ़ॉल्ट अज्ञात होना चाहिए, लेकिन मैं उत्सुक अगर कोई इसे दूसरे तरीके से किया है हूँ।

उत्तर

4

निश्चित रूप से एक अच्छा अभ्यास नहीं है। लेकिन अगर कोई दूसरा रास्ता नहीं है ... तो मैं आम तौर पर दूसरा विकल्प से जाना होगा:

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

0 सम्मेलन 'नहीं त्रुटि' और -1 से अच्छी तरह से चला जाता है समझ वहाँ कुछ त्रुटि है कि के साथ ठीक हो जाता है (जो अज्ञात हो सकता है)।

+2

सम्मेलन के आधार पर प्रश्न का उत्तर देने के लिए धन्यवाद, और यह कितना क्रोधित है उससे विचलित नहीं हो रहा है। – bwerks

2

कोई त्रुटि नहीं होने पर त्रुटि कोड को वापस क्यों लौटाएं?

पूरी तरह से समझ में नहीं आता है। इसे हटाने से आपकी समस्या का समाधान होगा।

आपकी टिप्पणी एक छोटे से डरावना है

public enum ErrorCode 
{ 
    Unkown = 0, 
    InsufficientPermissions, 
    ConnectivityError 
} 

अद्यतन: तुम बस 0 अज्ञात के लिए हो सकता है बना सकते हैं। आपके पास ऐसी विधि नहीं होनी चाहिए जो एक प्रकार का त्रुटि कोड लौटाए। यह बहुत खराब अभ्यास है। चूंकि त्रुटि कोड केवल असाधारण परिस्थितियों में वापस आना चाहिए, अपवादों को फेंकना एक अच्छा विचार है।

यदि आप चाहते हैं, तो आपके पास अपने कस्टम अपवाद में एक फ़ील्ड हो सकती है जिसमें त्रुटि कोड मूल्य होता है।

+0

यदि आपके फ़ंक्शन का हस्ताक्षर 'सार्वजनिक त्रुटि कोड DoFoo()' है, तो फ़ंक्शन सफल होने पर आप क्या लौटते हैं? – Karmastan

+2

@ कर्मस्तान - मेरे पास कभी ऐसा तरीका नहीं होगा जो त्रुटि कोड लौटाए। मेरे पास एक कस्टम अपवाद होगा जो फेंक दिया जाता है और उसके अंदर त्रुटि कोड शामिल होता है। –

+2

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

15

चूंकि आप अपने प्रश्न को सर्वोत्तम प्रथाओं के साथ टैग कर रहे हैं: जब आप अपवादों का उपयोग कर सकते हैं तो त्रुटि कोड का उपयोग न करें।

+0

इस मुद्दे से संबंधित एक और पोस्ट: [अपवाद या त्रुटि कोड] (http://stackoverflow.com/questions/253314/exceptions-or-error-codes) – Karmastan

+4

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

+3

एक त्रुटि अनिवार्य रूप से असाधारण अवसर नहीं है। त्रुटि कोड मान्य विधि का वापसी मान हो सकता है। –

6

मेरी राय में Unknown या None का अर्थ ErrorCode गणना के संदर्भ में एक ही बात है। मेरा तर्क यह है कि अगर मैं इसके बजाय एक त्रुटि कोड की जांच कर रहा हूं क्योंकि मुझे पहले से ही एक त्रुटि है।

मुझे यह भी राय है कि एक त्रुटि कोड गणना केवल कस्टम अपवाद में या मौजूदा अपवाद प्रकार के कस्टम डेटा के रूप में उपयोगी है और दोनों स्थितियों में आपको हमेशा एक त्रुटि होगी।

+0

यह कॉल मुझ पर निर्भर नहीं है, दुख की बात है; हालांकि, यह मान दिया गया है कि ये मान डेटाबेस पर बने रहेंगे, यह अज्ञात को डेटाबेस में शून्य करने के लिए अनुवाद के साधन के रूप में शामिल करना समझ में आता है। हालांकि, मुझे लगता है कि उस मामले में एक नामुमकिन का उपयोग करना भी काम करेगा। – bwerks

+0

आपको कॉल क्यों नहीं है? यदि आप अपवाद को पकड़ने वाले कोड तक पहुंच नहीं पाते हैं और त्रुटि कोड लौटाते हैं (विशेष रूप से अज्ञात त्रुटियों के लिए) तो आप enum मानों को कैसे बदल सकते हैं? यदि यह एक राजनीतिक समस्या है, तो कृपया, न्याय और सत्य के प्यार और पैसे बचाने के लिए, उन शक्तियों को इंगित करें जो इस और संबंधित एसओ पदों से संबंधित हैं ताकि वे देख सकें कि अधिकांश पेशेवर सॉफ्टवेयर डेवलपर्स दृढ़ता से त्रुटि कोड का विरोध करने का विरोध करते हैं! – apollodude217

0

त्रुटि कोड खराब। अपवाद अच्छा है। लेकिन प्रश्न के उत्तर देने के लिए:

यदि आपके enum में "अज्ञात" मान है, तो यह डिफ़ॉल्ट होना चाहिए।

+0

सबसे पहले, त्रुटि कोड अक्सर अपवादों के साथ संयुक्त होते हैं। दूसरा, यह एक मान्य विधि प्रदान करने के लिए विनम्र है ताकि उपयोगकर्ता देख सके कि कुछ क्रियाओं का प्रयास करने पर क्या त्रुटियां उत्पन्न होंगी। Remeber, CPU समय और कोड की लाइनों में अपवाद महंगा हैं। –

+0

@ जोनाथन, मैं सहमत हूं, सिवाय इसके कि सत्यापन के साथ, क्या आप वास्तव में इसे "त्रुटि कोड" कहते हैं? साथ ही, आमतौर पर सत्यापन उच्च स्तर पर होता है जिसे आप सत्यापन त्रुटि का प्रतिनिधित्व करने के लिए स्थिरांक (या स्थानीय तार) का उपयोग कर सकते हैं। यदि यह कोड की आवश्यकता के लिए आपके ढांचे में पर्याप्त गहरा हो जाता है, तो यह वास्तव में * असाधारण स्थिति है। –

+0

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

3

सबसे पहले, आपके पास कोई भी त्रुटि कोड नहीं होना चाहिए। इसके बजाय, इसे "सफलता" कहते हैं।

अब इस बारे में सोचें कि आप त्रुटि कोड कैसे जांचेंगे। अधिकांश लोगों को कुछ इस तरह की उम्मीद:

if (errorCode != Success) 

या वे आशुलिपि

if (errorCode != 0) 

तो वहाँ तुम्हारे पास है का उपयोग करें। आपका सफलता कोड 0 है, आपके पास कोई भी कोड नहीं है, और अज्ञात कुछ भी हो सकता है जो आप चाहते हैं।

0

डिट्टो सभी के लिए "मैं यह कर नहीं होगा प्रतिक्रियाओं," लेकिन अगर आप जोर देते हैं, यहाँ मेरी $ 0.02 है। वहाँ कोई त्रुटि है के बाद से

ErrorCodes.None, कोई मतलब नहीं है। ErrorCodes.Unknown सहायक नहीं है। एक नल त्रुटि कोड लौटने का प्रयास करें:

public ErrorCode? DoFoo() 

अब आप अशक्त

var error = DoFoo(); 
if (error != null) 
    // react 

फिर भी बुरा के लिए जाँच कर सकते हैं, लेकिन कम से कम यह कोई त्रुटि है, तो आप के लिए नहीं वापसी एक त्रुटि कोड की अनुमति देता है।

+0

मैं इससे असहमत हूं। सबसे पहले, FxCop हमें बताता है कि "हमेशा enum स्पष्ट रूप से सेट नहीं किया गया है" के लिए हमारे पास हमेशा "डिफ़ॉल्ट" मान होना चाहिए। इसलिए, "अज्ञात" या "कोई नहीं" होना निश्चित रूप से उपयुक्त है। दूसरा, एक Nullable या का उपयोग कर? सिंटैक्स उपभोक्ता को कुछ चुनने के लिए मजबूर करने के लिए एक enum होने का एक प्रमुख बिंदु कमजोर पड़ता है! –

4

मुझे लगता है कि मैं इस पर हर किसी के साथ असहमत हूं। "। क्या इस सुविधा की वर्तमान स्थिति है"

त्रुटि कोड के साथ गलत कुछ भी नहीं है जब के अर्थ में प्रयोग किया जाता है

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

मेरे लिए, मैं 0 के रूप में कोई नहीं का प्रयोग करेंगे, डिफ़ॉल्ट के रूप में। मुझे अज्ञात नकारात्मक बनाने का कोई कारण नहीं दिखता है। अज्ञात एक बिल्कुल सही त्रुटि स्थिति है। आप इसे सूची के अंत में रख सकते हैं। अभ्यास में, मैं

public enum ErrorCode 
{ 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
    Unknown, 
} 

किया है और अपने सवाल का जवाब देने, मैं कहता हूँ कोई भी डिफ़ॉल्ट होना चाहिए। कोई मतलब नहीं है: कोई त्रुटि मौजूद नहीं है जिसके बारे में आप जानते हैं। अज्ञात मेरा मतलब होगा: एक त्रुटि मौजूद है जो इतनी अस्पष्ट है कि आप अपने कोड में इसके लिए खाता नहीं ले सकते हैं।

0

मैं वास्तव में किसी को भी बताएगा कि आपने केवल अपवाद का उपयोग करना चाहिए से असहमत करना होगा। डेटाबेस का उपयोग करने वाले किसी भी प्रकार का एप्लिकेशन उपयोग करते समय आप सिस्टम में डेटा के लिए स्थिति स्टोर करना चाह सकते हैं। चाहे वे त्रुटि कोड हों या किसी प्रकार की स्थिति हो, वे डेटाबेस में पूर्णांक के रूप में सबसे अच्छी तरह से प्रतिनिधित्व करते हैं।

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

मैं वास्तव में है कि परिवर्तन "कोई नहीं" के लिए "सफलता" के रूप में सुझाव दिया सुझाव है, लेकिन है कि आप "सफलता" 1 का मान करते हैं, और वहाँ से सभी अन्य त्रुटियों को बढ़ा देते है। इसका कारण यह है कि अधिकांश डेटाबेस अनुप्रयोगों में मानक के रूप में स्थिति कॉलम शून्य नहीं होते हैं, और आमतौर पर पूर्णांक के रूप में ट्रैक किए जाते हैं। यदि आप 0 की सफलता स्थिति का उपयोग करते हैं तो इससे समस्याएं पैदा हो सकती हैं क्योंकि डिफ़ॉल्ट रूप से गैर नलबल पूर्णांक कॉलम 0 पर सेट किए जाएंगे यदि कोई उपयोगकर्ता स्पष्ट रूप से कुछ और नहीं डालेगा। यह एक झूठी स्थिति/त्रुटि कोड का कारण बनता है और आपके आवेदन के भविष्य में समस्याएं पैदा करता है।न केवल पूर्णांक चर स्वचालित रूप से सी # में डिफ़ॉल्ट रूप से 0 पर प्रारंभ हो जाते हैं, जिससे यह स्वचालित सफलता हो जाती है, इसलिए यदि आप प्रारंभिक मान सेट नहीं करते हैं तो गणनाएं हैं, और यह कुछ नहीं है जो आप चाहते हैं।

कोडिंग स्टैंडपॉइंट से भी 1 का मतलब भी सच हो सकता है, और इसलिए यह सफलता के साथ अच्छी तरह से चला जाता है। ऐसी स्थितियां हैं जहां यह मामला नहीं हो सकता है। यूनिक्स आधारित सिस्टम में 0 की वापसी का मतलब सफलता/कोई त्रुटि नहीं है, और अन्य भाषाओं में सी ++ 0 रिटर्न मुख्य कार्य से मानक है जो मुख्य कार्य के सफल निष्पादन को इंगित करता है।

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