2016-08-07 9 views
18
void foo() try {} catch (...) {} 
// OK, function-try-block 

लैम्बडा के लिए कोई फंक्शन-ट्राई-ब्लॉक क्यों नहीं है?

[]() try {} catch (...) {}(); 
// error: expected ‘{’ before ‘try’ 

[]() { try {} catch (...) {} }(); 
// OK, extra curly braces` 

क्यों दूसरा संस्करण अनुमति नहीं है?

+0

क्या संस्करण 1 वास्तव में मान्य है? – JVApen

+5

@JVApen हां यह है। – DimChtz

+0

@JVApen यह आपको एक कोशिश-पकड़ ब्लॉक में एक कन्स्ट्रक्टर लपेटने का इरादा रखता है, जो तब प्रारंभिकरण के दौरान फेंकने वाले किसी भी अपवाद को पकड़ने में सक्षम होगा; चूंकि ऑब्जेक्ट पहले से ही कन्स्ट्रक्टर के शरीर में प्रवेश करता है, तब तक शरीर के बाहर ट्राइक-कैच ब्लॉक में प्रवेश करने के लिए विशेष वाक्यविन्यास की आवश्यकता होती है। यह प्रोग्रामर को सामान्य रूप से संभालने के साथ अपवाद पारित करने से पहले आंशिक रूप से निर्मित वस्तुओं के लिए आवश्यक आवश्यक सफाई करने की अनुमति देता है। [फ़ंक्शन के अंदर घोषित ऑब्जेक्ट्स को कैच ब्लॉक (ओं) के अंत तक दायरे में माना जाता है।] –

उत्तर

5

मूल रूप से, कार्य-प्रयास-ब्लॉक को उपनिवेशों के रचनाकारों या विनाशकों में फेंकने वाले अपवादों को पकड़ने में सक्षम होने के लिए पेश किया गया था। वाक्यविन्यास स्थिरता के लिए सामान्य कार्यों में बढ़ाया गया था।

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

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