किलों को फेंकना और पकड़ना कैसे काम करता है?


14

इस कोड के साथ:

int main()
{
    try
    {
        throw -1;
    }
    catch (int& x)
    {
        std::cerr << "We caught an int exception with value: " << x << std::endl;
    }
    std::cout << "Continuing on our merry way." << std::endl;

    return 0;
}

हमारे पास है:

/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1

catchब्लॉक कैसे पढ़ता -1है int&? हम एक नॉन-कॉन्स्टल लैवल्यू रेफरेंस को वैल्यू नहीं दे सकते।

और std::coutपहले std::cerrकथन से पहले दूसरे कथन को क्यों निष्पादित किया जाता है?


2
क्या आप सुनिश्चित हैं कि यह आपके द्वारा प्राप्त सटीक आउटपुट है? We caught an int exception with value: -1लाइन पहले मुद्रित किया जाना चाहिए।
होलीब्लैकैट

1
@Sffff, क्षमा करें आप सही हैं, पहला आउटपुट पुनर्निर्देशित error streamनहीं है standard stream
घासेम रमज़ानी


2
@ फ्रांकोइसएंड्रीक्स जिस कारण से इसकी अनुमति है, वहां अलग-अलग शब्दार्थ चल रहे हैं। आम तौर पर एक अस्थायी के साथ आप नहीं जानते कि क्या होने जा रहा है, इसलिए यह केवल अस्थायी लोगों के संदर्भों की अनुमति देने का निर्णय लिया गया था। अपवादों के साथ, हम वस्तु के जीवनकाल को जानते हैं और हम इसे संशोधित करना चाहते हैं और इसे एक उच्च संदर्भ में पुनर्जीवित कर सकते हैं। इसे सुविधाजनक बनाने के लिए, मानक एक गैर-कॉन्स्टल लैवल्यू संदर्भ के लिए बाइंडिंग की अनुमति देता है।
नेथनऑलिवर

1
@ फ़्राँस्वाएंड्रीक्स throwआपके द्वारा पास की गई वस्तु की प्रतिलिपि (या चाल) बनाता है। संदर्भ उस प्रति को बांधता है। यह इस तरह से समझ में आता है कि कॉपी एक लवलीन है।
होलीब्लैककैट

जवाबों:


10

यह इसके अलावा ठीक है [सिवाय इसके]

एक अपवाद कॉपी-इनिशियलाइज़ करना ([dcl.init], [class.copy.ctor]) एक अस्थायी ऑब्जेक्ट को फेंकना, अपवाद ऑब्जेक्ट कहलाता है। मिलान करने वाले हैंडलर ([छोड़कर)

जोर मेरा

जैसा कि आप देख सकते हैं, भले ही यह एक अस्थायी है, संकलक इसे हैंडलर को शुरू करने के लिए एक अंतराल के रूप में मानता है। इस वजह से, आपको एक संदर्भ की आवश्यकता नहीं है।


1
लेकिन उस क्रम के साथ क्या है जिसमें संदेश दिखाई देते हैं?
टॉम ज़ातो -

8

से इस throwसंदर्भ :

अन्य अस्थायी वस्तुओं के विपरीत, कैच क्लॉज मापदंडों को शुरू करते समय अपवाद ऑब्जेक्ट को एक लॉवल्यू तर्क माना जाता है, इसलिए इसे लैवल्यू संदर्भ, संशोधित और पुनर्विचार द्वारा पकड़ा जा सकता है।

तो जबकि "ऑब्जेक्ट" अस्थायी है, यह अभी भी एक अंतराल है और जैसे कि आप इसे संदर्भ द्वारा पकड़ सकते हैं।

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