C++ में त्रुटि प्रबंधन: try/catch A से Z तक – पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: C++ में विश्वसनीय कोड की नींव क्यों है त्रुटि प्रबंधन

\n\n

बाहरी दुनिया (फ़ाइलें, नेटवर्क, उपयोगकर्ता इनपुट) के साथ काम करने वाला कोई भी प्रोग्राम अनिवार्य रूप से अपवादात्मक स्थितियों का सामना करता है। C++ में, try/catch तंत्र ऐसी स्थितियों को सुंदर और नियंत्रित तरीके से प्रबंधित करने के लिए प्राथमिक उपकरण है। इस लेख में, हम C++ में त्रुटि प्रबंधन को बुनियादी संरचनाओं से लेकर उन्नत तकनीकों तक, best practices और संभावित समस्याओं सहित, विस्तार से समझेंगे।

\n\n

1. मूल बातें: try, catch और throw

\n\n

C++ में अपवाद तंत्र तीन मुख्य कीवर्ड पर आधारित है: try, catch और throw।

\n\n

1.1. try और catch ब्लॉक

\n

try ब्लॉक में वह कोड होता है जो अपवाद फेंक सकता है। catch ब्लॉक इस अपवाद को पकड़ता है और इसे संभालता है।

\n\n
#include <iostream>\n#include <stdexcept>\n\nint main() {\n    try {\n        // कोड जो त्रुटि उत्पन्न कर सकता है\n        int age = -5;\n        if (age < 0) {\n            throw std::invalid_argument("आयु ऋणात्मक नहीं हो सकती");\n        }\n        std::cout << "आयु: " << age << std::endl;\n    }\n    catch (const std::invalid_argument& e) {\n        std::cerr << "त्रुटि: " << e.what() << std::endl;\n    }\n    return 0;\n}
\n\n

1.2. अपवादों के प्रकार

\n

C++ में, आप किसी भी प्रकार के अपवाद फेंक सकते हैं: संख्याएँ, स्ट्रिंग्स, क्लास ऑब्जेक्ट्स। हालाँकि, <stdexcept> से मानक अपवाद क्लासेस का उपयोग करने या std::exception से प्राप्त अपनी स्वयं की क्लासेस बनाने की अनुशंसा की जाती है।

\n\n
    \n
  • मानक अपवाद: std::runtime_error, std::logic_error, std::out_of_range आदि।
  • \n
  • उपयोगकर्ता-परिभाषित अपवाद: std::exception से इनहेरिटेंस के माध्यम से बनाए जाते हैं।
  • \n
\n\n
class MyException : public std::exception {\npublic:\n    const char* what() const noexcept override {\n        return "मेरा अपना अपवाद";\n    }\n};
\n\n

1.3. एकाधिक catch-ब्लॉक

\n

आप अलग-अलग catch ब्लॉक में विभिन्न प्रकार के अपवादों को पकड़ सकते हैं। क्रम महत्वपूर्ण है: अधिक विशिष्ट अपवाद पहले आने चाहिए।

\n\n
try {\n    // कोड\n} catch (const std::invalid_argument& e) {\n    // invalid_argument को संभालना\n} catch (const std::exception& e) {\n    // std से शेष सभी अपवादों को संभालना\n} catch (...) {\n    // catch-all: वह सब कुछ पकड़ता है जो ऊपर नहीं पकड़ा गया\n}
\n\n

2. उन्नत तकनीकें: स्टैक अनवाइंडिंग और RAII

\n\n

2.1. स्टैक अनवाइंडिंग (Stack Unwinding)

\n

जब कोई अपवाद फेंका जाता है, तो C++ स्वचालित रूप से throw बिंदु से संबंधित catch तक के रास्ते में सभी स्थानीय ऑब्जेक्ट्स को नष्ट कर देता है। इस प्रक्रिया को स्टैक अनवाइंडिंग कहा जाता है। यह try ब्लॉक में बनाए गए सभी ऑब्जेक्ट्स के लिए डिस्ट्रक्टर के कॉल की गारंटी देता है।

\n\n
class Resource {\npublic:\n    Resource() { std::cout << "संसाधन बनाया गया\\n"; }\n    ~Resource() { std::cout << "संसाधन नष्ट किया गया\\n"; }\n};\n\nvoid riskyFunction() {\n    Resource res;\n    throw std::runtime_error("कुछ गलत हो गया");\n}\n\nint main() {\n    try {\n        riskyFunction();\n    } catch (const std::exception& e) {\n        std::cerr << e.what() << std::endl;\n    }\n    // आउटपुट: संसाधन बनाया गया -> संसाधन नष्ट किया गया -> कुछ गलत हो गया\n}
\n\n

2.2. RAII (Resource Acquisition Is Initialization)

\n

RAII एक प्रमुख C++ इडियम है जो त्रुटि प्रबंधन से निकटता से जुड़ा है। विचार: संसाधन प्रबंधन (मेमोरी, फ़ाइलें, म्यूटेक्स) को ऑब्जेक्ट के जीवनकाल से बांधना। डिस्ट्रक्टर स्वचालित रूप से संसाधन को मुक्त करता है, अपवाद की स्थिति में भी।

\n\n
    \n
  • स्मार्ट पॉइंटर्स: std::unique_ptr, std::shared_ptr

ब्लॉग

पुस्तक अनुशंसाएँ