क्या अपवादों के बिना C ++ के लिए कोई वास्तविक दुनिया के मामले हैं? [बन्द है]


40

में सी से अधिक C ++ उपयोग करने के लिए करते हैं, और सी ++ से अधिक सी? वहाँ एक बयान wrt है। कोड आकार / सी ++ अपवादों के लिए:

जेरी जवाब (अन्य बिंदुओं के बीच):

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

जिस पर मैंने पूछा कि ऐसा क्यों होगा, जिसके लिए जेरी ने जवाब दिया:

मुख्य बात यह है कि सी ++ में अपवाद हैंडलिंग शामिल है, जो (कम से कम आमतौर पर) निष्पादन योग्य आकार में कुछ न्यूनतम जोड़ता है। अधिकांश संकलक आपको अपवाद हैंडलिंग को अक्षम करने देंगे, लेकिन जब आप परिणाम करते हैं तो वह अब C ++ नहीं है। (...)

जिस पर मुझे वास्तव में तकनीकी वास्तविक विश्व स्तर पर संदेह नहीं है।


इसलिए मुझे दिलचस्पी है (विशुद्ध रूप से जिज्ञासा से) वास्तविक दुनिया के उदाहरणों से सुनने के लिए जहां एक परियोजना ने सी ++ को भाषा के रूप में चुना और फिर अपवादों को अक्षम करने के लिए चुना। (उपयोगकर्ता कोड में केवल "उपयोग नहीं" अपवाद नहीं, लेकिन उन्हें संकलक में अक्षम करें, ताकि आप अपवादों को फेंक या पकड़ न सकें।) एक परियोजना ने ऐसा करने का विकल्प क्यों चुना (अभी भी C ++ और C का उपयोग नहीं कर रहा है, लेकिन नहीं अपवाद) - (तकनीकी) कारण क्या हैं / थे?


परिशिष्ट: अपने उत्तरों के बारे में विस्तार से जानने के इच्छुक लोगों के लिए, यह विस्तार करना अच्छा होगा कि बिना किसी अपवाद के निहितार्थ को कैसे नियंत्रित किया जाता है:

  • एसटीएल संग्रह ( vector...) ठीक से काम नहीं करते (आवंटन विफलता की सूचना नहीं दी जा सकती)
  • new फेंक नहीं सकते
  • निर्माता विफल नहीं हो सकते

1
जेएसएफ सी ++। जेट और अपवाद मिक्स नहीं हैं।
कोडर

1
अपवादों के साथ समस्याओं के बारे में कुछ ज्ञानवर्धक जानकारी (और सामान्य तौर पर C ++) 250bpm.com/blog:4
Ambroz Bizjak

1
@AmbrozBizjak - मैं एक टिप्पणी से डेडएमजी को आपके द्वारा लिंक की गई पोस्ट से उद्धृत करूंगा: उद्धरण: "यह मुझे प्रतीत होता है कि आप अपवाद नहीं समझते हैं।" मैं सहमत हूँ। लेखक ने स्पष्ट रूप से अपवाद से निपटने में गड़बड़ी की, वह उस पोस्ट में दिए गए उदाहरणों को देखते हुए।
मार्टिन बा

जवाबों:


35

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


इसके अलावा, एक और उदाहरण Arduino हार्डवेयर SDK usnig gcc है बिना अपवाद C ++ में सक्रिय हुए, और अन्य चीजें जैसे कोई STL प्रदान नहीं किया गया है


कुछ तकनीकी कारण हैं, अच्छा या बुरा, जो भी हो, यह मेरी सलाह नहीं है, लेकिन जिन कारणों से मैंने सुना है:

  1. अधिकांश कंसोल वास्तव में सीमित मेमोरी और प्रोसेसिंग समय के साथ एम्बेडेड सिस्टम हैं। हो सकता है कि भविष्य के कन्सोल में यह इतना सही नहीं होगा, लेकिन पीसी की तुलना में करंट अभी भी शिकार करने वाले प्रतिबंधक हैं। कुछ पोर्टेबल कंसोल किसी भी स्मार्टफोन की तुलना में प्रोग्राम के लिए कठिन हैं, उदाहरण के लिए एनडीएस। अपवाद सुविधा स्मृति और गति की लागत का एक छोटा सा जोड़ देता है, भले ही आप इसका उपयोग न करें। आप अपने आप को जांच सकते हैं, यह पीसी पर भी सच है।
  2. कंसोल पर वीडियो गेम क्रैश नहीं कर सकते। उन्हें इस तरह से जांचना होगा कि किसी भी दुर्घटना या किसी भी मृत-अंत, किसी भी शोस्टॉपर से बचें। यही कारण है कि कंसोल निर्माता प्रकाशन से पहले खेलों की भारी जाँच करने के लिए कहते हैं। इसका मतलब यह भी है कि अपवाद प्रबंधन लागत को जोड़ता है जो कंसोल गेम के मामले में वास्तव में उपयोगी नहीं है। उदाहरण के लिए स्मार्टफोन में बेहतर है क्योंकि समस्या को ठीक करने के लिए कुछ तरीके हो सकते हैं या कुछ कोड जोड़ सकते हैं। अधिकांश कंसोल जैसे बंद प्लेटफ़ॉर्म इसकी अनुमति नहीं देते हैं। इसलिए एक अपवाद प्रणाली वास्तव में आवश्यक नहीं है। आपको "बस इसे सही तरीके से काम करना है"। ;)
  3. अपवाद प्रबंधन, जब आप त्रुटियों और दुर्घटनाओं की अनुमति नहीं देते हैं, तो इसका मतलब है कि आपको एक त्रुटि प्रबंधन रणनीति को लागू करना होगा। इस तरह की प्रणाली पर्याप्त जटिल हो सकती है कि किसी को काम करने के लिए इसे उपयोगी बनाने के लिए बहुत समय लगता है। गेम डेवलपर्स के पास उन सुविधाओं पर काम करने के लिए लक्जरी नहीं है जिन्हें क्रैश में उपयोगी माना जाता है ...
  4. संकलक इसे (अभी तक) अनुमति नहीं देता है। हां, ऐसा होता है।

मुझे लगता है कि अपवाद गेम में भी उपयोगी हो सकते हैं, लेकिन यह सच है कि कंसोल गेम पर यह वास्तव में उपयोगी नहीं है।


अद्यतन करें:

मैं यहाँ एक और आश्चर्यजनक उदाहरण जोड़ रहा हूँ: LLVM / CLang न तो अपवाद का उपयोग करें और न ही RTTI का पालन करने वाले कारणों के लिए :

कोड और निष्पादन योग्य आकार को कम करने के प्रयास में, LLVM RTTI (जैसे डायनेमिक_कास्ट <>) या अपवादों का उपयोग नहीं करता है। ये दो भाषा सुविधाएँ "आप जो उपयोग करते हैं उसके लिए केवल भुगतान करते हैं" के सामान्य C ++ सिद्धांत का उल्लंघन करते हैं, जिससे निष्पादन योग्य ब्लोट तब भी होता है जब अपवाद कभी भी कोड बेस में उपयोग नहीं किए जाते हैं, या यदि RTTI का उपयोग कभी भी क्लास के लिए नहीं किया जाता है। इस वजह से, हम उन्हें कोड में विश्व स्तर पर बंद कर देते हैं।

उस ने कहा, एलएलवीएम आरटीटीआई के एक हाथ से लुढ़का हुआ रूप का व्यापक उपयोग करता है जो कि आइए <>, कास्ट <>, और dyn_cast <> जैसे टेम्पलेट्स का उपयोग करता है। RTTI का यह रूप ऑप्ट-इन है और इसे किसी भी वर्ग में जोड़ा जा सकता है। यह डायनेमिक_कास्ट <> की तुलना में काफी अधिक कुशल है।

CLang अच्छी तरह से अपनी गति संकलन और स्पष्ट त्रुटियों के लिए जाना जाता है, लेकिन यह भी एक दुर्लभ संकलक है कि वास्तव में आसान करने के लिए पालन कोड है।


9
(3): यदि आपको साथ जाने की जरूरत है, तो आपको एक त्रुटि प्रबंधन रणनीति की जरूरत है (2)। समस्याएं सामने आएंगी, और आपके कंसोल सॉफ़्टवेयर को नरम और सुंदर तरीके से विफल होने की आवश्यकता है। मेरे लिए यह स्पष्ट नहीं है कि अपवादों से पूरी तरह से बचना किसी भी तरह से आसान है।
डेविड थॉर्नले

6
कसकर नियंत्रित रनटाइम वातावरण के सभी महान उदाहरण हैं जहां त्रुटियों को ठीक से नियंत्रित किया जाता है और "असाधारण" घटनाएं नहीं होती हैं।
पैट्रिक ह्यूजेस

1
@DavidThornley क्योंकि आप मानते हैं कि कंसोल का सिस्टम कुछ प्रकार की त्रुटियों को प्रबंधित करेगा, लेकिन ऐसा नहीं होगा। वैसे शायद यह PS3 या XBox पर होगा, लेकिन कंसोल बिल्डर के परीक्षणों को पारित करने की अनुमति नहीं दी जाएगी। वैसे भी, सबसे उन्नत कंसोल का फर्मवेयर उतना लचीला नहीं है जितना आप सोच सकते हैं। कंसोल गेम को कंसोल के लगभग सभी हार्डवेयर तक पहुंच की आवश्यकता होती है, इसलिए आप कंसोल पर चलने वाले गेम के बारे में सोच सकते हैं जैसे कि यह कंसोल का "ओएस" भी था ... जितना अधिक हमारे पास शक्तिशाली कंसोल हैं, कम सच है। इसलिए मैं आपसे सहमत हूं कि यह कुछ मामलों के लिए अजीब लगता है।
KCL

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

2
मैंने मूर्खतापूर्ण उदाहरण को हटा दिया क्योंकि उनकी टीम पर किसी ने कहा कि NO EXCEPTION को बढ़ावा देने का मतलब "अपवाद का कोई उपयोग नहीं" है, लेकिन "नियमों का कोई अपवाद नहीं है"। Permalink.gmane.org/gmane.comp.lib.boost.devel/231377
17

9

जेरी ने कहा: ... नतीजा अब काफी सी ++ नहीं है , जबकि मेरा रूपक यह है कि यह स्पष्ट रूप से सी ++ है, बस थोड़ी अलग बोली है क्योंकि कार्यक्रम अन्य रूपों, सम्मेलनों और लिखित शैलियों का उपयोग करते हैं।

उन्हें अक्षम करने के मेरे प्राथमिक कारण यहां दिए गए हैं:

बाइनरी संगतता

भाषा और अनुवाद की सीमाओं को पार करना सार्वभौमिक रूप से अच्छी तरह से परिभाषित या अपरिभाषित नहीं है। यदि आप अपने कार्यक्रम को परिभाषित व्यवहार के क्षेत्र में संचालित करना चाहते हैं, तो आपको मॉड्यूल निकास बिंदुओं पर अपवादों को छोड़ना होगा।

निष्पादन योग्य आकार

यहाँ मेरे द्वारा लिखे गए एक अपवाद मुक्त कार्यक्रम के द्विआधारी आकार हैं, बिना किसी अपवाद के और बिना सक्षम किए गए:

अपवादों के बिना:

  • निष्पादन योग्य + निर्भरताएँ: 330
  • अंतिम पट्टी निष्पादन योग्य (रिलीज बिल्ड): 37

अपवादों के साथ:

  • निष्पादन योग्य + निर्भरताएँ: 380
  • अंतिम पट्टी निष्पादन योग्य (रिलीज बिल्ड): 44

अनुस्मारक: यह पुस्तकालयों और कार्यक्रमों का एक संग्रह है जिसमें शून्य थ्रो / कैच शामिल हैं। कंपाइलर ध्वज C ++ मानक लाइब्रेरी में अपवाद सक्षम करता है । इसलिए, वास्तविक दुनिया में लागत इस उदाहरण में देखी गई 19% से अधिक है।

संकलक: सेब gcc4.2 + llvm। एमबी में आकार लेता है।

गति

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

कार्यक्रम की शुद्धता

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

सादगी

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

इतिहास / मौजूदा कोड

कुछ मामलों में, उन्हें ऐतिहासिक कारणों से कभी पेश नहीं किया गया। एक मौजूदा कोडबेस ने उनका उपयोग नहीं किया, कार्यक्रमों को बदलने में मानव-वर्ष लग सकते हैं और सम्मेलनों और कार्यान्वयन में ओवरलैप के कारण इसे बनाए रखने के लिए वास्तव में बदसूरत बना सकते हैं।

downsides

बेशक, डाउनसाइड हैं, सबसे बड़े हैं: अन्य पुस्तकालयों के साथ असंगतता (झुकाव बाइनरी), और यह तथ्य कि आपको इस मॉडल को फिट करने के लिए अच्छी मात्रा में कार्यक्रमों को लागू करना होगा।


+1 उत्कृष्ट जानकारी! (हालांकि मैं सरलता पैराग्राफ से सहमत नहीं हूं)
मार्टिन बा

यह दिलचस्प होगा यदि आपके पास केवल कोई असफल निर्माता नहीं है और आप आवंटन (- विफलता) को कैसे संभालते हैं।
मार्टिन बा

@ मर्टिन 1) असहमत होना काफी ठीक है। मैं समझता हूं कि अधिकांश देव कई कारणों से अपवादों से असहमत हैं। सादगी के लिए, यह कार्यक्रम शुद्धता के साथ जाता है। समस्याओं / अमान्य राज्यों को बस दूर यात्रा करने की अनुमति नहीं है। इसका मतलब है कि वे विफलताओं की जाँच करते हैं और इनायत से बाहर निकलते हैं। jheriko की पोस्ट इस पर गूँजती है।
जस्टिन

1
@ मर्टिन 2 बी) आवंटन थोड़ा अधिक जटिल है। सबसे पहले, ढेर आवंटन की संख्या संख्या में कम हो जाती है और आकार में बढ़ जाती है - शुरू करने के लिए अपेक्षाकृत कुछ हीप आवंटन हैं। दूसरा, आवंटन कस्टम आवंटनकर्ताओं के माध्यम से जाते हैं। यदि आवंटन शुरू में आवंटनकर्ता (उदाहरण के लिए mallocरिटर्न 0) के लिए प्रदान नहीं किया गया है , तो आवंटन while (1)में एक संदर्भ स्विच होता है, जिसके बाद आवंटन में एक और प्रयास होता है। इस कोडबेस में, यह हुआ करता था कि आवंटन के माध्यम से नया 0 वापस कर सकता है, लेकिन नया कार्यान्वयन ठीक काम कर रहा है। (cont)
जस्टिन

2
हाँ, कस्टम आवंटनकर्ता इंटरफेस पर एक stl संगत आवरण है। तकनीकी रूप से, कार्यक्रम रिलीज में गर्भपात नहीं करेगा; यह संदर्भ स्विच पेश करेगा (उदाहरण के लिए एक और धागा काम करने की अनुमति देगा जो उम्मीद है कि कुछ स्मृति को मुक्त करेगा), फिर से प्रयास करें, और लॉग करें यदि वह विफल हो - हमेशा के लिए। इकाई परीक्षण समस्या के बिना दिनों के लिए चल सकते हैं। एकमात्र वास्तविक खतरा बहुत बड़ा आवंटन है, जिनमें से कई अनुरोध से पहले पकड़े जाएंगे। फिर, सिस्टम की विफलता दर भी इस बिंदु पर रडार पर है; संभावना मौजूद है कि वे इस तरह के परिदृश्य में मूल कार्यान्वयन से पहले विफल हो जाएंगे।
जस्टिन

7

Google अपने C ++ स्टाइल गाइड में अपवादों को स्वीकार नहीं करता है , ज्यादातर ऐतिहासिक कारणों से:

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

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

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

विंडोज कोड के लिए इस नियम का कोई अपवाद नहीं है।

(संपादक का जोर)


5

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

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

क्यूटी कुछ अपवादों का उपयोग क्यों करता है?

आज, Qt की एक आम आलोचना यह है कि इसकी अपवाद सुरक्षा पूर्ण नहीं है।


1
धन्यवाद। अच्छी जानकारी, हालांकि मैं सोच रहा हूँ कि क्या अधिकांश क्यूटी कोड आधारों में संभवत: कंपाइलर में अपवाद हैं ...
मार्टिन बा

4

सिम्बियन C ++ (कुछ नोकिया मोबाइल फोन पर इस्तेमाल किया गया) अपवादों का उपयोग नहीं करता है, कम से कम सीधे नहीं, क्योंकि सिम्बियन पहली बार विकसित होने पर C ++ कंपाइलर्स ने उन्हें मज़बूती से लागू नहीं किया था।


1
यह सिम्बियन के आधुनिक संस्करणों के लिए नहीं है। सिम्बियन TRAPs और पत्तियों को वास्तविक C ++ अपवादों के रूप में लागू किया जाता है , लेकिन EPOC32 और सिम्बियन के पुराने संस्करणों ने अन्य साधनों पर भरोसा किया (अगर मैं सही तरीके से याद करूँ तो)
०१:१० पर

1
@OttoHarju: यही मेरा मतलब है "कम से कम सीधे नहीं"।
कीथ थॉम्पसन

3

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

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

स्वयं अपवादों के साथ गंभीरता से कुछ भी गलत नहीं है / यदि आप प्रदर्शन के बारे में परवाह नहीं करते हैं / और ठीक से कुछ करने का समय नहीं है - वे त्रुटि से निपटने के लिए एक भाषा सुविधा है और एक उचित त्रुटि हैंडलिंग तंत्र के लिए एक अच्छा विकल्प है। हालांकि, त्रुटियों को संभालने के लिए लगभग हमेशा / बेहतर / तरीके हैं - जैसे कि अपने स्वयं के तर्क (इसके बारे में विस्तार से बताने के लिए कठिन - यह लगभग सामान्य ज्ञान है)। यदि यह आपकी त्रुटि नहीं है, लेकिन एक पुस्तकालय (जैसे मानक पुस्तकालय) से आता है तो आपको अपवादों की पसंद का सम्मान करना होगा या कुछ दुर्घटना होगी, लेकिन मैं हमेशा उस विकल्प पर सवाल उठाऊंगा। मैंने कभी ऐसी स्थिति नहीं देखी जहां अपवाद वास्तव में सबसे अच्छा समाधान था।

दावे अधिक बहस योग्य हैं, त्रुटि कोड कम हैवीवेट हैं ... दोनों के बीच, यदि ठीक से उपयोग किया जाता है, तो आपको कोड पढ़ना, डीबग करना और बनाए रखना आसान होता है जो तेज है। इसकी जीत के सभी दौर ...


1
नहीं। अपवादों का दुरुपयोग करना आसान है, लेकिन इसके अलावा अन्य अपवाद अच्छी तरह से काम करते हैं। इसके बारे में तर्क करना कम से कम आसान है, बशर्ते आपके सभी कार्य अपवाद-सुरक्षित हों (और यह आमतौर पर सभी संसाधनों के लिए आरटीटीआई का उपयोग करने का मामला है, जो आपको वैसे भी करना चाहिए)। त्रुटि कोड को ठीक से करना बेहद थकाऊ हो सकता है, और परिणामस्वरूप आपके प्रोग्राम को त्रुटि-हैंडलिंग कोड के ढेर में दफन कर सकता है; उस मामले में, अपवाद बेहतर हैं। याद रखें, मेरी अलग-अलग चीजें करना आपके लिए निर्णायक सबूत नहीं है कि मैं चीजों को सही करने के बारे में परवाह नहीं करता हूं।
डेविड थॉर्नले

... जैसा कि आरटीटीआई क्यों बुरा है कि एक पूरी कहानी है - हर कंपाइलर में आरटीटीआई का निर्माण मैंने देखा है जो तुच्छ रूप से पीटा जा सकता है - अगर आपको आरटीटीआई की आवश्यकता है। हालांकि इसके सभी संदर्भ - आरटीटीआई और अपवाद जैसे ये चीजें आरएडी और उद्यम ऐप के लिए महान हो सकते हैं - उच्च प्रदर्शन (जैसे गेम) कंप्यूटिंग की दुनिया में इनका कोई स्थान नहीं है। मैंने कभी भी किसी भी लक्ष्य का उपयोग करते हुए एक प्रोडक्शन गेम इंजन को नहीं देखा है जहाँ उन्हें बंद किया जा सकता है ...
jheriko

2
क्षमा करें - RAII का मेरा मतलब है। यदि आप उसका उपयोग नहीं कर रहे हैं, तो केवल अपवाद ही गड़बड़ नहीं होने वाले हैं। (हालांकि, गतिशील कलाकार मेरे काम में बहुत अच्छी तरह से काम करते हैं, और मुझे प्रदर्शन से चिंतित होना पड़ता है।)
डेविड थॉर्नले

दिलचस्प विषय: मुझे लगता है कि अपवाद एक अधिक संक्षिप्त त्रुटि कोडिंग को संभालने की अनुमति देते हैं, लेकिन त्रुटि कोड अधिक मजबूत होते हैं क्योंकि वे स्थानीय रूप से त्रुटियों को संभालने की अनुमति देते हैं (आप कॉलर में तुरंत रिटर्न कोड की जांच कर सकते हैं, जबकि अपवाद कॉल-स्टैक को पकड़ने से पहले उन्हें पकड़ सकते हैं। और कभी-कभी वे पकड़े नहीं जाते हैं, जिसके परिणामस्वरूप दुर्घटना होती है। जब तक आप कैच (...) का उपयोग नहीं करते हैं।
जियोर्जियो

3

में संयुक्त स्ट्राइक लड़ाकू सी ++ मानक कोडिंग Bjarne एट द्वारा। अल।, लड़ाकू जेट विमानों की वास्तविक वास्तविक समय की आवश्यकताओं के कारण अपवादों पर प्रतिबंध लगा दिया गया है।

JSF ++ कठिन-वास्तविक समय और सुरक्षा-महत्वपूर्ण अनुप्रयोगों (उड़ान नियंत्रण सॉफ्टवेयर) के लिए है। अगर एक गणना में बहुत अधिक समय लगता है तो किसी की मृत्यु हो सकती है। उस कारण से, हमें प्रतिक्रिया समय की गारंटी देनी होगी, और हम कर नहीं सकते - उपकरण समर्थन के वर्तमान स्तर के साथ - अपवादों के लिए ऐसा करें। उस संदर्भ में, यहां तक ​​कि मुफ्त स्टोर आवंटन पर भी प्रतिबंध है! दरअसल, त्रुटि से निपटने के लिए JSF ++ सिफारिशें उस दिन की प्रत्याशा में अपवादों के उपयोग का अनुकरण करती हैं जहां हमारे पास चीजें सही करने के लिए उपकरण होते हैं, अर्थात अपवादों का उपयोग करना।

बज्ने के C ++ FAQ से उद्धृत ।

याद रखें, C ++ शायद सभी भाषाओं के सॉफ्टवेयर की सबसे विस्तृत विविधता को चलाता है ...


JSF ++ "नए" (प्लेसमेंट नए के अलावा) और "हटाएं" के उपयोग पर प्रतिबंध लगाता है। जो एक सवाल का थोड़ा सा "बिना किसी अपवाद के नई असफलता को कैसे हैंडल करते हैं" का एक उत्तर है ...
armb

@ कर्म: हाँ। देखें "उस संदर्भ में, यहां तक ​​कि मुफ्त स्टोर आवंटन पर भी प्रतिबंध है!" ऊपर।
मैके २e

2

यह C ++ लाइब्रेरी डिज़ाइन में महत्वपूर्ण है। अक्सर सी-इंटरफ़ेस के साथ यह आपके क्लाइंट के लिए 3 जी लाइब्रेरी से बाहर अपवाद फेंकने के लिए बहुत बुरा है। यह कहते हुए कि यदि आपका पुस्तकालय फेंकता है, तो आप उन ग्राहकों का एक समूह काट रहे हैं, जिन्होंने इसका इस्तेमाल किया होगा, यह देखते हुए कि इसकी कोई फेंक-फेंक गारंटी नहीं है (जो भी कारण ग्राहक के अपवादों पर प्रतिबंध के लिए है)।

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


1

शायद इस संबंध में, यह एंबेडेड सी ++ का उल्लेख करने योग्य है । एंबेडेड सी ++ एम्बेडेड सिस्टम के लिए डिज़ाइन किया गया C ++ का एक प्रकार है (स्पष्ट रूप से पर्याप्त)। यह मूल रूप से C ++ का उचित उपसमूह है, (अन्य चीजों के साथ) टेम्पलेट्स, नेमस्पेस, और अपवाद हैंडलिंग को हटा दिया गया है।

मुझे यह जोड़ना चाहिए कि जब EC ++ थोड़ा नया था, जब वे नए थे, तो वे ज्यादातर चुपचाप चले गए थे। मुझे यकीन नहीं है कि लोगों ने रुचि खो दी है, या उनका पहला प्रयास केवल इतना सही था कि किसी ने भी एक दशक या इसके साथ गड़बड़ करने का कोई कारण नहीं देखा है।<closed captioning for the humor impaired>Yeah, right!</closed captioning>


क्यू एंड ए की खोज - caravan.net/ec2plus/question.html - मैं कहूंगा कि यह बहुत ज्यादा मृत है।
मार्टिन बा

1

एक अच्छा उदाहरण कर्नेल मोड प्रोग्रामिंग है।

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

आमतौर पर आप अपने खुद के newऔर deleteऑपरेटरों को परिभाषित करते हैं । इसके अलावा, मैं बहुत काम पाया placement newऔर सी + + 11 rvalue संदर्भ। कोई एसटीएल या अन्य सी ++ उपयोगकर्ता-मोड पुस्तकालय जो अपवादों पर भरोसा करते हैं, का उपयोग किया जा सकता है।


0

जब आप निष्पादन योग्य मेमोरी को नीचे रखने का प्रयास कर रहे हों। आमतौर पर एम्बेडेड (या मोबाइल) सिस्टम पर किया जाता है। डेस्कटॉप एप्स के लिए सर्वर पर इसकी कभी जरूरत नहीं पड़ती है, लेकिन यदि आप वेब सर्वर या एसक्यूएल के लिए ज्यादा से ज्यादा रैम चाहते हैं तो इस पर विचार किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.