दिलचस्प पोस्ट
जीआईआई एनीमेशन ऑनलोड को रोकें, माउसओवर पर सक्रियण प्रारंभ करें सीमलेस लूप में एक छवि के अनंत स्क्रॉलिंग का पता लगाएं ईएफ 4.1 अपवाद "प्रदाता ने एक प्रोवाइडरमैनफास्ट टोकन स्ट्रिंग वापस नहीं किया" मूल्यों के आधार पर JSON को छंटनी क्या जिथूब को जावास्क्रिप्ट पुस्तकालयों के लिए सीडीएन के रूप में इस्तेमाल किया जाना चाहिए? JavaScript फ़ंक्शन के लिए एक डिफ़ॉल्ट पैरामीटर मान सेट करें एंड्रॉइड में बूट को पूरा करने के बाद ऑटो शुरूआती एप्लीकेशन <Input type = "text" /> में इनपुट के कई लाइनें एंड्रॉइड XXHDPI संसाधन जावा स्विंग टेक्स्टएरिया में हाइलाइटिंग रंग कैसे बदल सकता है? और यह भी, हाइलाइटिंग स्थान से संबंधित टेक्स्ट की शुरुआत में बदलाव करें जावास्क्रिप्ट फंक्शन ऑब्जेक्ट्स के गुण दौड़ स्थिति / डेडलॉक खोजने के लिए सी # /। नेट विश्लेषण उपकरण प्लगइन का निष्पादन जीवनचक्र कॉन्फ़िगरेशन द्वारा कवर नहीं किया गया (जेबोसास 7 ईएआर आदर्शरूप) क्या करता है '?' सी ++ में करते हैं? क्या एक चयन कथन में "पिछला पंक्ति" मान तक पहुंचने का कोई तरीका है?

सी ++, __ट्र्री और कोशिश / पकड़ / अंत में

मैं सी + + कोशिश / पकड़ / अंततः ब्लॉकों के बारे में थोड़ा सोच रहा हूँ मैंने इन कमांडों को __try जैसे दो अंडरस्कोर के साथ देखा है लेकिन एमवीएससी 2010 परियोजनाएं अंडरस्कोर्स के बिना भी चलती हैं। तो जब आपको इन अंडरस्कोर की आवश्यकता होती है?

वेब के समाधान से एकत्रित समाधान "सी ++, __ट्र्री और कोशिश / पकड़ / अंत में"

विंडोज़ पर, अपवाद ऑपरेटिंग सिस्टम स्तर पर समर्थित हैं। स्ट्रक्चर्ड अपवाद हैंडलिंग (एसईएच) कहा जाता है, वे यूनिक्स सिग्नल के बराबर हैं। विंडोज के लिए कोड जनरेट करने वाला कंपलर्स आमतौर पर इसका लाभ उठाते हैं, वे सी + + अपवाद को लागू करने के लिए एसईएच आधारभूत संरचना का उपयोग करते हैं।

सी ++ मानक के साथ रखते हुए, केवल फेंक और खोजशब्दों को पकड़कर केवल C ++ अपवाद फेंक और पकड़ें। एमएसवीसी कंपाइलर के लिए संबंधित एसईएच अपवाद कोड 0xe06d7343 है पिछले 3 बाइट्स "एमएससी" के लिए एएससीआईआई कोड हैं

इसे ऑपरेटिंग सिस्टम समर्थन के साथ एकीकृत करने का मतलब यह भी है कि सी + + डिस्ट्रक्टर्स को एसईएच अपवाद के लिए ढेर के दौरान बुलाया जाएगा जो कोड अन्तराल करता है वह विंडोज के अंदर होता है और एसईएच को उसी तरह फेंक देता है जैसे किसी भी एसईएच हालांकि, माइक्रोसॉफ्ट कंपाइलर में एक अनुकूलन है जो कोड को बनाने से बचने की कोशिश करता है, जो सुनिश्चित करता है कि डिस्ट्रक्टर्स को सभी मामलों में कहा जाता है। यदि यह साबित हो सकता है कि ऑब्जेक्ट के जीवनकाल को नियंत्रित करने वाले स्कोप ब्लॉक के अंदर कोई फेंक नहीं है, तो यह पंजीकरण कोड छोड़ देता है। यह अतुल्यकालिक SEH अपवादों के साथ संगत नहीं है, यदि आप SEH अपवाद को पकड़ना चाहते हैं तो आपको इस अनुकूलन को दबाने के लिए / EHa संकलन विकल्प का उपयोग करना चाहिए।

वहाँ कई SEH अपवाद प्रकार हैं। ऑपरेटिंग सिस्टम द्वारा जेनरेट किए जा सकते हैं, उन्हें ntstatus.h SDK हैडर फ़ाइल में सूचीबद्ध किया गया है। इसके अलावा, आप अपने स्वयं के अपवाद प्रबंधन को लागू करने के लिए एसईएच का इस्तेमाल करने वाले कोड के साथ इंटरपॉप कर सकते हैं, वे अपने अपवाद कोड का उपयोग करेंगे। .NET की तरह, प्रबंधित अपवाद 0xe0434f4d ("com") अपवाद कोड का उपयोग करते हैं।

सी ++ प्रोग्राम में एसईएच अपवाद को पकड़ने के लिए, आपको गैर मानक __try कीवर्ड का उपयोग करना चाहिए। __ अधिकतम कीवर्ड सी + + कैच कीवर्ड के अनुरूप है। इसमें अधिक क्षमताएं हैं, आप एक अपवाद फ़िल्टर अभिव्यक्ति निर्दिष्ट करते हैं जो एक सक्रिय अपवाद पकड़ा जाना चाहिए या नहीं। कुछ भी संभव है, लेकिन आप आम तौर पर यह देखने के लिए पारित अपवाद जानकारी को देखते हैं कि क्या आप इसे प्रबंधित करने में रुचि रखते हैं। __finally कीवर्ड आपको कोड लिखने देता है जो अपवाद के बाद चलाया जाता है। इसके लिए सी ++ में कोई समतुल्य नहीं है, लेकिन अन्य भाषाओं में असामान्य नहीं है

टिप्पणियों में बताया गया है कि यह सब काफी खराब है। साक्ष्य पुडिंग में है। यहां एक उदाहरण कार्यक्रम है जिसमें आप खेल सकते हैं। यह दर्शाता है कि SEH अपवाद अभी भी C ++ डिस्ट्रक्टर्स को कॉल करने के लिए अनुमति देता है, बशर्ते आप / ईएचए के साथ संकलन करें और कैसे सी + + अपवाद SEH के शीर्ष पर लागू होते हैं। एमएसवीसी कंपाइलर की आवश्यकता है, डीबगर मददगार होने से बचने के लिए Ctrl + F5 के साथ चलें:

 #include "stdafx.h" #include <windows.h> #include <iostream> // NOTE: the value of the C/C++, Code Generation, Enable C++ Exceptions setting in important // Try it both with /EHsc (the default) and /EHa to see the difference class Example { public: ~Example() { std::cout << "destructed" << std::endl; } }; int filterException(int code, PEXCEPTION_POINTERS ex) { std::cout << "Filtering " << std::hex << code << std::endl; return EXCEPTION_EXECUTE_HANDLER; } void testProcessorFault() { Example e; int* p = 0; *p = 42; } void testCppException() { Example e; throw 42; } int main() { __try { testProcessorFault(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } __try { testCppException(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } return 0; } 

आउटपुट:

 Filtering c0000005 destructed caught Filtering e06d7363 destructed caught 

__try / __except (विंडोज जनरेटेड एरर) को पकड़ने के लिए है, सामान्य अपवादों को पकड़ने के लिए नहीं।

सामान्य C ++ अपवादों को संभालने के लिए सी ++ मानक निर्दिष्ट करता है / catch है

मानक सी ++ कोड के लिए आप लिखते हैं, आपको हमेशा try / catch उपयोग करना चाहिए और नहीं __try / __except

साथ ही, finally में सी ++ मानक निर्दिष्ट निर्माण नहीं है, यह आपके लिए काम करता है क्योंकि यह एक माइक्रोसॉफ्ट कंपाइलर एक्सटेंशन है

__try/__except माइक्रोसॉफ्ट विशिष्ट है यदि आप चाहते हैं कि आपका कोड अन्य कंपाइलर (उदाहरण के लिए जी ++) (या) किसी अन्य ओएस में उनका उपयोग करने से बचें, और मानक try/catch बयान के साथ रहें