2011-11-01 10 views
5

CreateFile जैसे कुछ विंडोज फ़ंक्शन विशालGetLastError नामक त्रुटि कोडों की विविधता वापस कर सकते हैं, और प्रत्येक संभावित त्रुटि कोड की जांच करने के लिए अव्यवहारिक है - अक्सर पर्याप्त दस्तावेज नहीं होते हैं, और नए त्रुटि कोड अक्सर जोड़े जाते हैं।मुझे कौन सी त्रुटियों को संभालना चाहिए? कौन सा "घातक" हैं?

उनमें से कुछ (जैसे एक्सेस उल्लंघन या अमान्य पैरामीटर) प्रोग्रामर त्रुटि के कारण हैं और प्रोग्राम निष्पादन की निरंतरता की अनुमति नहीं देनी चाहिए। हालांकि, अन्य अन्य कारकों के कारण हैं, जैसे खराब फ़ाइल अनुमतियां, उल्लंघन साझा करना, खराब फ़ाइल नाम इत्यादि, जिसे डेवलपर के पास बहुत कम या कोई नियंत्रण नहीं है।

मैं अपने कार्यक्रम को क्रैश करने के लिए "गंभीर त्रुटियों" (जैसे उल्लंघन उल्लंघन) की अनुमति देते हुए सभी "गैर-महत्वपूर्ण" त्रुटियों (जैसे खराब फ़ाइल नाम) को संभालना चाहता हूं।

आदर्श रूप में, मैं कह रहा की जाएगी:

// ... an error occurred. Is it a programmer error? 

if (IsErrorCritical(GetLastError())) 
{ 
    // Yes; raise an exception, crashing the program. 
    RaiseException(GetLastError(), 0, 0, NULL); 
} 

मैं कैसे तय करते हैं जो त्रुटि कोड को दबाने के लिए सुरक्षित हैं (उदाहरण के लिए, जब एक डिस्क पर फ़ाइलों की गणना), जब मैं संभवतः प्रत्येक और हर परिणाम अनुमान नहीं लगा सकते ?

+2

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

+0

ठीक है, लेकिन मुझे कैसे पता चलेगा कि कुछ "वास्तव में असाधारण" है या नहीं? यही सवाल है .. – Mehrdad

+0

जब मैं असाधारण कहता हूं तो मेरा मतलब बिल्कुल है। उल्लंघन का उल्लंघन और स्मृति से बाहर चलना दो बड़े हैं; अन्य हो सकते हैं, लेकिन आपको विचार मिलता है। यदि CreateFile() विफल होने से आपके प्रोग्राम को क्रैश हो जाता है तो आप इसे गलत IMHO कर रहे हैं। – Luke

उत्तर

3

मुझे लगता है कि यह वास्तव में संदर्भ पर निर्भर करता है, आम तौर पर यह तय करना असंभव है कि इसे मामले के आधार पर किसी मामले पर निर्णय लेने की आवश्यकता है।

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

4

"गंभीर" इस ​​बात पर निर्भर करता है कि आप फ़ाइल के साथ क्या कर रहे हैं।

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

त्रुटियों के लिए जिन्हें आप विशेष रूप से संभाल नहीं पाते हैं ("अज्ञात" वाले), बस मान लें कि फ़ाइल नहीं बनाई गई थी, और उस मामले को संभालें। इससे कोई फर्क नहीं पड़ता कि यह क्यों बनाया गया था, बस मान लें कि यह उस परिदृश्य के लिए नहीं था और खाता था। आपका कोड क्या कर रहा है और इस परिदृश्य में आप कितना प्रयास करना चाहते हैं, इस पर निर्भर करता है, यह घातक हो सकता है या नहीं।

ध्यान दें कि उल्लंघन उल्लंघन कुछ ऐसा नहीं है जो GetLastError() जानता है, इसलिए मैं आपके प्रश्न की प्रासंगिकता को समझ नहीं पा रहा हूं।

+0

असल में, मुझे * GetLastError' से वापस उल्लंघन उल्लंघन प्राप्त हुआ है। निश्चित रूप से 'CreateFile' के साथ नहीं, लेकिन अन्य कार्यों से (मुझे याद नहीं है कि दुर्भाग्यवश कौन से हैं)। लेकिन वैसे भी अच्छा बिंदु, +1। – Mehrdad

+0

"getlasterror से वापस उल्लंघन का उपयोग करने" का क्या अर्थ है? – tenfour

+0

इसका मतलब है कि मुझे GetLastError से वापस 'ERROR_NOACCESS' प्राप्त हुआ है, लेकिन मुझे याद नहीं है कि मुझे इसके लिए कौन सा फ़ंक्शन मिला है। – Mehrdad

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