यदि आपकी समस्या आपके स्वयं के खराब कोड से आती है, तो इसके खिलाफ सुरक्षा के लिए ASSERT का उपयोग करना बेहतर है। अपवाद हैंडलिंग को उन समस्याओं की पहचान करने की आवश्यकता होती है जो प्रोग्राम उपयोगकर्ता को संभाल नहीं सकते हैं और उन्हें उपयोगकर्ता के बारे में बता सकते हैं, क्योंकि उपयोगकर्ता उन्हें संभाल सकता है। लेकिन आपके प्रोग्राम में बग कुछ ऐसा नहीं है जिसे उपयोगकर्ता संभाल सकता है, इसलिए प्रोग्राम क्रैश होने से ज्यादा कुछ नहीं होगा
मैं स्वीकृत उत्तर के इस पहलू से असहमत हूं । एक अपवाद को फेंकने की तुलना में एक मुखर बेहतर नहीं है। यदि अपवाद केवल रन-टाइम त्रुटियों (या "बाहरी समस्याओं") के लिए उपयुक्त थे, तो इसके लिए क्या है std::logic_error
?
एक तर्क त्रुटि लगभग उस प्रकार की स्थिति से होती है जो किसी प्रोग्राम को जारी रखने से रोकती है। यदि कार्यक्रम एक तार्किक निर्माण है, और उस तर्क के डोमेन के बाहर एक स्थिति होती है, तो यह कैसे जारी रह सकता है? जब आप कर सकते हैं, तो इनपुट इकट्ठा करो और एक अपवाद फेंक दो
ऐसा नहीं है कि पूर्व कला नहीं है। std::vector
नाम के लिए, लेकिन एक, एक तर्क त्रुटि अपवाद, अर्थात् फेंकता है std::out_of_range
। यदि आप मानक पुस्तकालय का उपयोग करते हैं और मानक अपवादों को पकड़ने के लिए एक शीर्ष-स्तरीय हैंडलर नहीं है - यदि केवल कॉल करने के लिए क्या () और निकास (3) - तो आपके कार्यक्रम चुप, समाप्ति के अधीन हैं।
एक जोरदार मैक्रो एक बहुत कमजोर गार्ड है। कोई वसूली नहीं है। जब तक, कि, आप डिबग बिल्ड नहीं चला रहे हैं, जिस स्थिति में कोई निष्पादन नहीं है । अभिकथन मैक्रो उस युग का है जब गणना आज की तुलना में 6 धीमी परिमाण के आदेश थे। यदि आप तर्क त्रुटियों के लिए परीक्षण करने के लिए मुसीबत में जा रहे हैं, लेकिन उस परीक्षण का उपयोग करने के लिए नहीं जब यह मायने रखता है, उत्पादन में, आपको अपने कोड में बहुत अधिक विश्वास होगा!
मानक पुस्तकालय तर्क त्रुटि अपवादों के लिए प्रदान करता है, और उन्हें रोजगार देता है। वे एक कारण के लिए वहाँ हैं: क्योंकि तर्क त्रुटियां होती हैं, और असाधारण हैं। सिर्फ़ इसलिए कि सी सुविधाओं के दावे में इस तरह के एक आदिम (और, यकीनन, बेकार) तंत्र पर भरोसा करने का कोई कारण नहीं है, जब कोई अपवाद इतना बेहतर काम करता है।