catch (...)
एक तथाकथित "पकड़ो सभी" ब्लॉक है। यह किसी भी सी ++ अपवाद को पकड़ लेगा।
catch(std::exception& e)
केवल अपवाद जो std::exception
से प्राप्त किए गए अपवादों को पकड़ेंगे।
यहाँ एक अपवाद है कि कैच-ऑल द्वारा बुलाया जाएगा का एक उदाहरण है, लेकिन नहीं दूसरे संस्करण:
throw 42;
यह आप के लिए अजीब लग सकता है, और यह है। एहसास करने की महत्वपूर्ण बात यह है कि कुछ भी को सी ++ अपवाद के रूप में फेंक दिया जा सकता है - न केवल exception
एस या exception
से ली गई चीजें। चूंकि @ bames53 टिप्पणियों में उल्लेख करता है, वहां कोई रूट अपवाद प्रकार नहीं है जो सभी अपवादों से लिया गया है, जैसे कि कुछ अन्य भाषाओं में है।
यह भी ध्यान रखना महत्वपूर्ण है कि एक कैच-ऑल ब्लॉक दुरुपयोग के लिए बहुत आसान है। वास्तव में, अंगूठे के सामान्य नियम के रूप में यह मानना सबसे अच्छा हो सकता है कि सभी पकड़-सभी ब्लॉक प्रोग्राम दोष हैं। बेशक, प्रोग्रामिंग में "हमेशा" नहीं है, लेकिन जब आप अपवादों का उपयोग करना सीख रहे हैं तो यह एक सुरक्षित धारणा है।
कारण है कि सभी ब्लॉक एविल हैं, क्योंकि आम तौर पर उनका उपयोग कैसे किया जाता है। आम तौर पर, एक बेवकूफ प्रोग्रामर किसी प्रोग्रामिंग त्रुटि को पकड़ने के प्रयास में कैच-ऑल लिखता है और फिर, गंभीर रूप से, प्रोग्राम को चलाना जारी रखना जारी रहता है जैसे कुछ भी नहीं हुआ है। यह एक आपदा होने का इंतजार कर रहा है। कार्यक्रम राज्य अब अनिश्चित है। कुछ, कहीं गलत हो गया है। आप अपवादों को सुरक्षित रूप से अनदेखा नहीं कर सकते हैं और सब कुछ ठीक तरह से चलते रहेंगे। यहां तक कि यदि आपका प्रोग्राम चलना जारी रखता है, तो वहां कहीं सूक्ष्म ढेर भ्रष्टाचार हो सकता है जो प्रोग्राम की गणना या उसके आउटपुट को मिटाना चाहेगा। जब ढेर भ्रष्टाचार होते हैं, तो प्रोग्रामर के रूप में आप जो सबसे अच्छी चीज की उम्मीद कर सकते हैं वह तत्काल दुर्घटना है। इस तरह आप भ्रष्टाचार के बिंदु पर कॉल स्टैक और डंप फ़ाइल प्राप्त कर सकते हैं और समस्या को ढूंढ सकते हैं और ठीक कर सकते हैं। लेकिन जब आपके पास एक जगह है, तो आप सभी संदर्भ खो चुके हैं जहां यह भ्रष्टाचार होता है। आपके कोड में असली दोष खोजने के लिए लगभग असंभव हो जाता है।
बेशक, सभी हैंडलर पकड़ने के वैध और मूल्यवान उपयोग हैं। सबसे आम बात यह है कि वैश्विक अपवाद हैंडलर लिखना है जो फिर से throw
अपवाद है। यह ग्लोबल हैंडलर किसी प्रकार की गलती लॉगिंग शुरू कर सकता है, शायद या तो एक त्रुटि लॉगिंग करके, या एक बाहरी प्रोग्राम को उत्पन्न करने से जो असफल प्रोग्राम के बाहर लॉगिंग करता है। अपवाद को फिर से फेंककर, आप प्रतिनिधि को उन अपवादों को संभालने का अवसर देते हैं जिन्हें संभाला जा सकता है, जबकि अपवाद की अनुमति दी जाती है जिसे प्रोग्राम को समाप्त करने के लिए नहीं किया जा सकता है।
अपवाद को रेथ्रो करना करना आसान है। सीधे शब्दों में कोई तर्क के साथ throw
कहते हैं, के साथ के रूप में:
catch (...)
{
// some magic
throw;
}
ध्यान में रखने की एक और बात यह है कि जब आप एक अपवाद को पकड़ने करते हैं, यह आम तौर पर सबसे अच्छा है सिर्फ एक संदर्भ की तुलना में एक const
संदर्भ को पकड़ने के लिए है, न कि है ।
सी ++ सब है कि एक 'जड़' अपवाद प्रकार नहीं है अपवादों का उत्तराधिकारी होता है क्योंकि सी ++ कुछ भी फेंक सकता है, जिसमें वे प्रकार शामिल नहीं हो सकते हैं; जैसे 'Int'। सी ++ कुछ भी फेंक सकता है क्योंकि उन्हें अपवाद कम सामान्य बनाने का कोई कारण नहीं दिखता था। यह सी ++ टेम्पलेट्स के समान है; सी ++ टेम्पलेट्स विरासत पर भरोसा नहीं करते हैं और इसलिए जावा या सी # जेनेरिक से अधिक सामान्य हैं जो विरासत पर भरोसा करते हैं। – bames53
कुछ विंडोज एसईएच अपवाद कभी-कभी '...' द्वारा पकड़े जा सकते हैं लेकिन 'std :: अपवाद 'द्वारा नहीं। –
@MooingDuck केवल तभी आप पागल झंडे के साथ संकलित करते हैं, अनुशंसित/ईएचएससी (यदि आप कर सकते हैं) का उपयोग करें और आप ठीक होंगे –