2010-12-10 6 views
14

अगर मैं अप्रबंधित सी ++, विजुअल स्टूडियो 2008 या उससे अधिक में एक नई परियोजना बना रहा हूं, तो कौन सा अपवाद हैंडलिंग मॉडल मैं साथ जाना चाहता हूं?दृश्य सी ++ अप्रबंधित कोड: सी ++ अपवादों के लिए उपयोग/ईएचए या/ईएचएससी?

मैं समझता हूं कि/ईएचए विकल्प कम कुशल कोड में परिणाम देता है, और एसईएच अपवाद भी पकड़ता है, है ना?

तो मैं उस विकल्प को स्पष्ट रूप से चला रहा हूं और आमतौर पर/ईएचएससी के साथ जा रहा हूं, ताकि मैं केवल सी ++ अपवादों को पकड़ रहा हूं जो वास्तव में फेंक रहे हैं और पहुंच उल्लंघन और अन्य संरचित निष्पादन को पकड़ने में नहीं हैं (...) संचालकों। अगर मेरे कोड में कोई एक्सेस उल्लंघन है, तो मैं नहीं चाहता कि इसे पकड़ (...) {} द्वारा मुखौटा किया जा रहा हो।

मैं उन लोगों के साथ कोड करता हूं जो पकड़ने के लिए (...) {} कुछ भी नहीं करते हैं और यदि कोई पहुंच उल्लंघन होता है तो वे इसे भी करना चाहते हैं, जो मुझे वास्तव में एक बुरा विचार लगता है। यदि खराब कोडिंग के कारण कोई बग है, तो आप अपनी उंगलियों को अपने कानों में नहीं रखना चाहते हैं और जोर से कहते हैं "ला ला ला ला ला!" ताकि आपको प्रोग्राम क्रैश न हो? वास्तव में, यदि कोड कोडिंग त्रुटि के कारण कोड खराब स्थिति में है, तो क्या आप वास्तव में कोड जारी रखना चाहते हैं?

तो मेरा सामान्य विचार यह है कि/ईएचए बड़ा/धीमा कोड बनाता है और यह प्रोग्रामर को लिखित कोड से दूर जाने की अनुमति देता है कि अगर घातक बग मौजूद है, तो यह एक अनिर्धारित स्थिति में चलना जारी रहेगा।

बीटीडब्ल्यू, मैं एप्लिकेशन और सेवा कोड के बारे में बात कर रहा हूं जो हम अधिकांश भाग के लिए लिख रहे हैं। कम स्तर के डिवाइस ड्राइवर या ऐसा कुछ भी नहीं।

कृपया अपने विचारों के साथ वजन करें।

उत्तर

16

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

और हाँ, यह पकड़ (...) के व्यवहार को बदल देता है, अब यह किसी भी एसईएच अपवाद को फ़िल्टर करता है, न केवल सी ++। यह वास्तव में एक जुआ है क्योंकि आप सभी वास्तव में गंदे सामान, असीमित हार्डवेयर अपवादों को पकड़ते हैं। यद्यपि मैं व्यक्तिगत रूप से नहीं सोचता कि सभी सी ++ अपवादों को पकड़ना बहुत ही रक्षात्मक है, फिर भी आपके पास अभी भी एक अस्पष्ट विचार है कि कार्यक्रम की स्थिति किस डिग्री में परिवर्तित हो गई और यह क्यों विफल हुआ।

वास्तविक रूप से, आपको __try/__except का उपयोग करने के लिए स्विच करने की आवश्यकता होगी ताकि आप अपना खुद का अपवाद फ़िल्टर लिख सकें और बुरे लोगों को पकड़ने से बच सकें। सी ++ अपवादों के लिए अपवाद कोड 0xe04d5343 ("एमएससी") है। _set_se_translator() का उपयोग करना एक और दृष्टिकोण होगा।

4

मैं/ईएचए का उपयोग करता हूं क्योंकि यह .NET इंटरऑप के साथ सुरक्षित है, जबकि/ईएचएससी नहीं हो सकता है; उदाहरण के लिए Destructors not called when native (C++) exception propagates to CLR component देखें।

हालांकि, यदि कोड के एक विशिष्ट बिट के लिए अतिरिक्त प्रदर्शन वास्तव में मायने रखता है और आपको .NET (या जो कुछ भी) संगतता की आवश्यकता नहीं है, तो सुनिश्चित करें,/EHsc ठीक लगता है।

न तो/ईएचएससी और न ही/ईएचए अधिकांश मेमोरी त्रुटियों को पकड़ता है, इसलिए पहुंच उल्लंघन को पकड़ने के लिए इनका उपयोग करना एक निराशाजनक मामला है।

+2

आपको किसी भी मामले में एक्सेस उल्लंघनों को पकड़ने की कोशिश कभी नहीं करना चाहिए। –

+1

यह मेरी समझ है ... लेकिन मेरे पास लोगों को पकड़ने (...) {} और यदि/ईएचए चुना गया है, तो वह उस विश्वास उल्लंघन को दफन करेगा जो मेरा मानना ​​है। पकड़ने के लिए यह एक बात है (...) {cleanup_stuff; फेंकना; } लेकिन यहां तक ​​कि उस मामले में, यदि यह एक एक्सेस उल्लंघन है जिसे पकड़ा जा रहा है, तो क्या आप सुनिश्चित हैं कि cleanup_stuff यह काम करने जा रहा है? आप एक बुरे राज्य में हैं, इसलिए शायद मुझे लगता है कि कार्यक्रम सिर्फ दुर्घटनाग्रस्त होने से सबसे अच्छा है। – MarkS

+3

मैं क्लाइंट/सर्वर सिस्टम पर काम कर रहा हूं, जहां सर्वर में अपवाद है (आदर्श रूप से, एक्सेस उल्लंघन सहित कोई अपवाद), मैं सर्वर थ्रेड को क्रैश होने की अनुमति देने से पहले क्लाइंट को अपवाद संदेश भेजना चाहता हूं। अन्यथा, सर्वर बस जवाब देना बंद कर देता है। –

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