2009-03-04 8 views
11

सी ++ फ़ंक्शन से संभावित अपवाद-फेंक घोषित करने का क्या फायदा है? दूसरे शब्दों में, कीवर्ड throw() वास्तव में क्या जोड़ता है?सी ++ फ़ंक्शन द्वारा अनुमत थ्रो को सीमित करने का क्या फायदा है?

मैंने पढ़ा है कि void do_something() throw(); जैसे फ़ंक्शन घोषणा की गारंटी होनी चाहिए कि do_something() फ़ंक्शन से कोई अपवाद नहीं हुआ है; हालांकि, यह do_something() के भीतर बुलाए गए कार्यों के बारे में सही नहीं लगता है, इस प्रकार यह कमजोर गारंटी देता है।

कृपया इस भाषा सुविधा के उपयोगिता (और सबसे अच्छे उपयोग के मामलों) की रूपरेखा तैयार करें।

उत्तर

22

कोई भी बताते हैं इस बेहतर सूटर से

http://www.ddj.com/architect/184401544

लघु संस्करण

  1. कभी छोड़कर संभवतः एक खाली एक
+0

इस लिंक के लिए धन्यवाद! – Narek

0

असल में, throw(); साथ समारोह की घोषणा के द्वारा आप संकलक बताओ कि तुम एक सौ हैं प्रतिशत निश्चित प्रति कि समारोह नहीं किसी भी अपवाद फेंकने के लिए, संकलक कुछ ऑप्टिमाइज़ेशन करने के लिए अनुमति देता है के लिए जा रहा है। यदि आपका फ़ंक्शन किसी भी अपवाद को फेंक देता है, तो आप परेशानी में हैं, क्योंकि यह संभवतया अपरिभाषित व्यवहार में परिणाम देता है।

+2

अच्छी तरह से एक अपवाद विनिर्देश

  • बारे में है परिभाषित व्यवहार, वास्तव में: यह अप्रत्याशित() कहते हैं। खराब रूप से लागू व्यवहार, हाँ, लेकिन अच्छी तरह से परिभाषित। – MSalters

  • 5

    सी ++ मानक की आवश्यकता है कि unexpected() फ़ंक्शन को कॉल किया जाता है यदि कोई फ़ंक्शन अपवाद को फेंकने का प्रयास करता है जो इसकी अपवाद सूची पर नहीं है। एमएसडीएन से इसका एक संक्षिप्त विवरण यहां है: http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

    अधिकांश कंपाइलर्स वास्तव में इस सी ++ सुविधा का समर्थन नहीं करते हैं।

    +1

    >> अधिकांश कंपाइलर्स वास्तव में इस सी ++ सुविधा का समर्थन नहीं करते हैं << - और एक उदाहरण के लिए, एमएसवीसी प्रलेखन पृष्ठ देखें जो आपने इंगित किया है ... –

    1
    void do_something() throw(); 
    

    यह कार्यान्वयनकर्ता की ओर से एक गारंटी है कि समारोह कभी अपवाद नहीं फेंक देगा। फ़ंक्शन का क्लाइंट अपेक्षा कर सकता है। हालांकि, इसका मतलब यह भी है कि फ़ंक्शन के अंदर कहीं भी उत्पन्न अपवाद को संभाला जाता है और do_something() के पैरेंट पर वापस नहीं किया जाता है। उस पर शर्मिंदा है जो री -throw-भीतर से है, क्योंकि ऐसा कुछ भी नहीं है जो उसे फेंकने से रोक देगा। ऐसा इसलिए है क्योंकि, एक खाली अपवाद के साथ किसी फ़ंक्शन के भीतर से फेंकना-विनिर्देश विनिर्देश में उल्लिखित अपवाद को फेंकने के बराबर है और std::unexpected() को प्रोग्राम समाप्ति के बाद उम्मीद की जा सकती है।

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

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

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