2010-04-29 14 views
5

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

के साथ शुरू करने के लिए, अपने आप अपवाद वर्ग के राक्षस के दस्तावेज़ से उद्धृत:

राक्षस वापसी मान कभी नहीं का उपयोग करता है त्रुटियों से संकेत मिलता है। इसके बजाय, यदि कोई त्रुटि उत्पन्न होती है, तो एक अपवाद फेंक दिया जाता है, और यह वह वस्तु है जो समस्या के विवरण को समाहित करती है। OGRE का उपयोग करने वाले एप्लिकेशन को हमेशा यह सुनिश्चित करना चाहिए कि अपवाद पकड़े गए हैं, इसलिए सभी OGRE इंजन फ़ंक्शंस {} पकड़ (Ogre :: अपवाद & ई) {} ब्लॉक के भीतर होना चाहिए।

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

मैं अब हमारे कोड में कुछ और प्रयास/पकड़ ब्लॉक जोड़ना शुरू कर रहा हूं, आम तौर पर इस बारे में सोच रहा हूं कि ओग्रे फ़ंक्शन अपवाद फेंकता है या नहीं। अगर ऐसा कुछ है जो काम कर रहे सबकुछ को रोक देगा तो मुख्य प्रयास/पकड़ इसे संभालने दें और प्रोग्राम से बाहर निकलें। यदि यह बहुत महत्वपूर्ण नहीं है तो फ़ंक्शन कॉल के ठीक बाद इसे पकड़ें और कार्यक्रम जारी रखें। इसका एक हालिया उदाहरण एक इकाई पर लागू सामग्रियों के लिए कशेरुक/खंड कार्यक्रम पैरामीटर का एक वेक्टर बनाना था - यदि किसी सामग्री में कोई पैरामीटर नहीं था तो यह एक अपवाद फेंक देगा, जिसे मैंने पकड़ा और फिर अनदेखा किया क्योंकि यह ' टी पैरामीटर की मेरी सूची में जोड़ने की जरूरत है। क्या यह चीजों से निपटने का एक उचित तरीका प्रतीत होता है? ओग्रे के साथ काम करने के लिए कोई विशिष्ट सलाह बहुत सराहना की जाती है।

उत्तर

19

आपको try { ... } catch में ओग्रे को हर अंतिम कॉल को लपेटने की आवश्यकता नहीं है। आप इसे कहीं भी अपवाद से निपटने के लिए कर सकते हैं। यह कुछ मामलों में व्यक्तिगत कॉल साइट पर हो सकता है, या यह किसी प्रकार के उच्च स्तरीय पाश में हो सकता है। यदि आप इसे अर्थपूर्ण रूप से कहीं भी सौदा नहीं कर सकते हैं, तो इसे बिल्कुल पकड़ न लें; डीबगर को खत्म करने दें।

विशेष रूप से, आपको उद्धरण के कारण main() में अपवाद नहीं लेना चाहिए (कम से कम, विकास के दौरान नहीं, आपको उत्पादन में होना चाहिए)।

+6

+1 "जहां भी आप अर्थपूर्ण रूप से अपवाद के साथ सौदा कर सकते हैं" – Yacoby

+0

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

+0

जब अपवाद नहीं पकड़े जाते हैं तो डीबगर इसे पकड़ता है, और आपको वह बिंदु दिखाता है जहां से इसे फेंक दिया गया था। – Christopher

6

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

+0

मुझे लगता है कि ओग्रे अधिकतर ठीक है संसाधन आवंटन बिंदु दृश्य, इसमें से अधिकांश इसका स्वयं का साझा सूचक वर्ग का उपयोग करता है (जिसे वे आपको फिर से उपयोग करने की अनुशंसा नहीं करते हैं ...) और जब आप सामान का उपयोग नहीं कर रहे हैं तो आप इसे साफ़ करने के लिए छोड़ सकते हैं। – identitycrisisuk

6

आप अपवादों को डीबग करने के बारे में अनजान प्रतीत होते हैं। या तो

  • वी.एस. डीबग/अपवाद संवाद को लाने और C++ अपवाद टिकटिक बॉक्स। अपवाद फेंकने पर यह आपको अवसर (एक संवाद प्रकट होता है) डीबग करने के लिए देगा।

या

  • आप बनाए हैं, तो राक्षस स्रोत, Ogre::Exception निर्माता में एक ब्रेकपाइंट सेट और जब यह एक फेंक करने का प्रयास करता आप के साथ एक कॉल स्टैक विभाजित करेंगे, जहां अगले स्तर फेंक साइट है।
+0

बहुत बहुत धन्यवाद, मुझे पता था कि कुछ ऐसा होगा लेकिन इसे काफी नहीं मिला। कन्स्ट्रक्टर ब्रेकपॉइंट के बारे में भी सोचना चाहिए था। – identitycrisisuk

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

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