C++ में त्रुटि प्रबंधन: try, catch और आधुनिक दृष्टिकोण

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

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

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

C++ में त्रुटि प्रबंधन: try/catch से RAII और noexcept तक



प्रोग्राम की विश्वसनीयता सीधे तौर पर इस बात पर निर्भर करती है कि वह अप्रत्याशित स्थितियों पर कैसे प्रतिक्रिया करता है। C++ में, इसके लिए मुख्य तंत्र exceptions हैं। इस लेख में, हम क्लासिक try/catch/throw संरचना के साथ-साथ वैकल्पिक और आधुनिक दृष्टिकोणों: RAII, noexcept और बिना exceptions के त्रुटि प्रबंधन पर चर्चा करेंगे।



1. मूल तंत्र: try, catch, throw



Exception एक ऑब्जेक्ट है जो त्रुटि होने पर "फेंका" (throw) जाता है। प्रोग्राम इसे पकड़ (catch) सकता है और कार्य को पूरी तरह बाधित किए बिना सुधारात्मक कार्रवाई कर सकता है।



सिंटैक्स

#include <iostream>#include <stdexcept>

double divide(double a, double b) { if (b == 0.0) { throw std::runtime_error("Division by zero!"); } return a / b;}

int main() { try { double result = divide(10.0, 0.0); std::cout << "Result: " << result << std::endl; } catch (const std::runtime_error& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0;}


कार्य करने के नियम

  • throw — ऑब्जेक्ट की एक प्रतिलिपि बनाता है और नियंत्रण हैंडलर को स्थानांतरित करता है।
  • try — कोड का ब्लॉक जहाँ exceptions उत्पन्न हो सकते हैं।
  • catch — प्रकार के आधार पर exception को पकड़ता है। कई catch ब्लॉक निर्दिष्ट किए जा सकते हैं।
  • यदि exception को पकड़ा नहीं जाता है, तो std::terminate() कॉल किया जाता है।


बेस क्लास द्वारा पकड़ना

सभी मानक exceptions std::exception से विरासत में मिलते हैं। इसलिए, एक सार्वभौमिक हैंडलर लिखा जा सकता है:

try {    // code} catch (const std::exception& e) {    std::cerr << "Standard error: " << e.what() << std::endl;} catch (...) {    std::cerr << "Unknown exception" << std::endl;}

catch (...) ब्लॉक सभी exceptions को पकड़ता है, लेकिन ऑब्जेक्ट तक पहुँच के बिना।



2. कंस्ट्रक्टर और डिस्ट्रक्टर में Exceptions



कंस्ट्रक्टर

यदि कंस्ट्रक्टर कोई exception फेंकता है, तो ऑब्जेक्ट को निर्मित नहीं माना जाता है, और उसके लिए डिस्ट्रक्टर कॉल नहीं किया जाता। यह संसाधन प्रबंधन के लिए महत्वपूर्ण है। उदाहरण:

class Resource {public:    Resource() {        std::cout << "Resource allocated" << std::endl;        throw std::runtime_error("Initialization error");    }    ~Resource() {        std::cout << "Resource freed" << std::endl;    }};

int main() { try { Resource r; } catch (...) { std::cout << "Exception caught" << std::endl; } // Resource का डिस्ट्रक्टर कॉल नहीं होगा! return 0;}


डिस्ट्रक्टर

डिस्ट्रक्टर से exceptions फेंकना — बुरा अभ्यास है। यदि स्टैक अनवाइंडिंग के दौरान डिस्ट्रक्टर कॉल किया जाता है और वह एक नया exception फेंकता है, तो प्रोग्राम क्रैश हो जाता है। हमेशा डिस्ट्रक्टर को noexcept (डिफ़ॉल्ट रूप से वे ऐसे ही होते हैं) के रूप में लिखें।



3. RAII — स्वचालित संसाधन प्रबंधन

RAII (Resource Acquisition Is Initialization) मुहावरा सुरक्षित कोड की कुंजी है। संसाधन (मेमोरी, फ़ाइल, म्यूटेक्स) कंस्ट्रक्टर में प्राप्त किया जाता है और डिस्ट्रक्टर में मुक्त किया जाता है। यदि कोई exception होता है, तो सभी निर्मित ऑब्जेक्ट्स के डिस्ट्रक्टर स्वचालित रूप से कॉल होते हैं (स्टैक अनवाइंडिंग), और संसाधन मुक्त हो जाते हैं।



स्मार्ट पॉइंटर std::unique_ptr के साथ उदाहरण:

#include <memory>#include <iostream>

void process() { auto ptr = std::make_unique<int>(42); // यदि यहाँ कोई exception होता है, // unique_ptr स्वचालित रूप से मेमोरी मुक्त कर देगा throw std::runtime_error("Error in proc"); ```

ब्लॉग

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