2010-05-03 18 views
12

कोई भी सी ++ में उपयोग किए जाने वाले अपवाद विनिर्देशों को समझा सकता है?क्या कोई मुझे सी ++ अपवाद विनिर्देशों को समझा सकता है?

  • जब वे उपयोग किया जाता है (मैं शायद ही कभी देखा है यह कोड में प्रयुक्त)
  • पक्ष-विपक्ष अपवाद विनिर्देशों का उपयोग कर के (लाभ/नुकसान) क्या हैं?
+4

अपवाद विनिर्देशों पर निश्चित लेख: http://www.gotw.ca/publications/mill22.htm "नैतिक # 1: अपवाद विनिर्देश कभी नहीं लिखें। नैतिक # 2: संभवतः एक खाली एक को छोड़कर, लेकिन अगर मैं आप भी इससे बचेंगे। " –

+0

http://www.gotw.ca/publications/mill22.htm –

+1

भविष्य से संदेश: यदि कोई आज इसे पढ़ रहा है, तो उसे पता होना चाहिए कि 'अस्वीकरण' प्रोग्राम प्रदर्शन में सुधार कर सकता है (सी ++ 11 में) –

उत्तर

15

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

अपवाद विनिर्देशों का उपयोग करने के पेशेवरों और विपक्ष (लाभ/नुकसान) क्या हैं?
वे आपके कोड के पाठकों को यह जानने के लिए एक तरीका प्रदान करते हैं कि फंक्शन को फेंकने की अनुमति कितनी अपवाद है। समस्या यह है कि अगर एक अप्रत्याशित अपवाद (विनिर्देश में नहीं है) फेंक दिया जाता है, तो प्रोग्राम समाप्त हो जाएगा (डिफ़ॉल्ट रूप से)।

+0

@ जेम्स मैकनेलिस: धन्यवाद :) –

-3

असल में, अपवाद विनिर्देश संकलक को ढेर को अनुकूलित करने की अनुमति देते हैं। नुकसान यह है कि यह बहुत अधिक विशिष्ट कल्पना का नरक है। इसका मतलब यह है कि आप इसे आमतौर पर पुस्तकालय के काम में देखते हैं लेकिन कामकाजी कोड में इतना ज्यादा नहीं।

मेरा मानना ​​है कि कुछ संकलन-समय अपवाद-सुरक्षा चीज भी चल रही है, लेकिन चूंकि मैंने कभी इसका उपयोग नहीं किया है, इसलिए मैं सुनिश्चित नहीं हो सकता।

+0

-1 : अपवाद चश्मे के ढेर के साथ बिल्कुल कुछ नहीं करना है। –

+1

http://msdn.microsoft.com/en-us/library/7f10tsf4(v=VS.80).aspx मुझे लगता है कि जब हम अवांछित वस्तुओं पर चर्चा करते हैं, तो इसमें स्टैक के साथ कुछ भी नहीं है। – Puppy

+0

अपवाद विनिर्देश _can_ जेनरेट कोड के कुछ संकलक अनुकूलन की अनुमति देता है; अर्थात्, एक खाली अपवाद विनिर्देश (यानी, 'फेंक() ') कंपेलर प्रोग्रामर की गारंटी के आधार पर कुछ अन्य आवश्यक कोड को छोड़ने की अनुमति दे सकता है कि फ़ंक्शन अपवाद नहीं फेंक देगा। यह कितना मदद करता है, मुझे कोई जानकारी नहीं है; मैं ईमानदारी से नहीं सोचता कि मैंने कभी भी अपने कोड में एक अपवाद विनिर्देश लिखा है। –

12

उन्हें आम तौर पर एक बुरा विचार माना जाता है।

वे कहते हैं कि एक विधि क्या फेंक जाएगी। नकारात्मकता यह है कि यदि वह विधि कुछ और फेंकता है तो आपका ऐप समाप्त हो जाता है। तो यह गारंटी है लेकिन जावा ने ऐसा नहीं किया है। और यह निरीक्षण के ऊपरी हिस्से को जोड़ता है।

+3

+1: लेकिन नाइटपिक: एप्लिकेशन समाप्त नहीं हुआ है; अप्रत्याशित कार्य कहा जाता है। डिफ़ॉल्ट रूप से इसका मतलब है कि आपका ऐप समाप्त हो गया है, लेकिन अगर आपके पास अप्रत्याशित फ़ंक्शन कुछ और कर रहा है तो इससे कुछ और होगा। –

+0

+1 चश्मा फेंक दिया गया है, लेकिन दुर्भाग्यवश C++ 0x में नहीं हटाया गया है। @ बिली: स्पष्टीकरण के लिए +1। मेरे पास 2 उदाहरण हैं जिनके बारे में मैं सोच सकता हूं, ऑफहैंड, जहां नो-थ्रो स्पेक वांछनीय है: सी ++ अपवादों के रूप में क्रॉस भाषा/इंटरऑप सीमाओं के लिए जाने वाले विनाशकों और कार्यों/विधियों को दूसरों के साथ अच्छा प्रदर्शन नहीं होता है। (और मुझे पता है कि सी ++ 0x कहते हैं कि नो-फेंक चश्मा बदलते हैं और वर्तमान वाक्यविन्यास को हटा दिया जाता है)। –

+1

@ बिली: अप्रत्याशित फ़ंक्शन पहले कुछ त्रुटि रिपोर्टिंग कर सकता है, लेकिन क्या इसे प्रोग्राम को समाप्त नहीं करना है? आईआईआरसी ने अप्रत्याशित() से वापस आने के लिए मना किया है। –

6

जानना महत्वपूर्ण बात यह है कि: नो-थ्रो विनिर्देशक (throw()) को छोड़कर अपवाद विनिर्देशों को सी ++ के अगले संशोधन में बहिष्कृत किया गया है, जो मूल रूप से आधिकारिक तौर पर "उनका उपयोग न करें" कह रहा है।

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

उदाहरण:

void MyFunction() throw() // does not throw any exceptions 
{ 
    /* ... */ 
{ 
+3

कोई फेंक गारंटी बहुत महत्वपूर्ण नहीं है। विशेष रूप से विनाशकों के लिए। हालांकि यह अच्छा होगा अगर संकलक आपको चेतावनी देगा कि आपके पास कोई फेंक विधि नहीं है जो संभावित रूप से फेंक सकती है। –

+1

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

+0

@ ओकल्टा मुझे यकीन है कि 'नोएक्ससेप्ट' चिह्नित एक फ़ंक्शन अभी भी एक अपवाद फेंक सकता है। – Navin

1

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

एक जगह जहां मैं वास्तव में उनका उपयोग करने की सिफारिश करता हूं वह विनाशकों पर है। यह वास्तव में खराब है यदि कोई विनाशक फेंकता है। उन्हें कभी फेंकना चाहिए।इसलिए, यदि आप एक विनाशक पर throw() का उपयोग करते हैं, यह इंगित करने के लिए कि यह अपवाद नहीं फेंक सकता है, तो आप जानते हैं कि खराब प्रोग्राम में जारी रखने के बजाए आपका प्रोग्राम मर जाएगा, यह एक विनाशक से अपवाद के बाद होगा।

भले ही, यदि आप किसी भी तरह के फेंक विनिर्देशक का उपयोग करते हैं, तो आपको यह सुनिश्चित करना होगा कि यदि आप उल्लंघन करते हैं तो आप वास्तव में अपने प्रोग्राम को मरना चाहते हैं। इसलिए, आम तौर पर बोलते हुए, उनका उपयोग करना सबसे अच्छा नहीं है।

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