C++ में उन्नत त्रुटि प्रबंधन: try/catch से औद्योगिक प्रथाओं तक
त्रुटि प्रबंधन औद्योगिक प्रोग्रामिंग के आधार स्तंभों में से एक है। C++ में, डेवलपर के पास न केवल क्लासिक try/catch तंत्र तक पहुंच है, बल्कि उन्नत तकनीकों का एक पूरा शस्त्रागार भी है: RAII से लेकर अपवाद सुरक्षा गारंटी तक। इस लेख में, हम यह पता लगाएंगे कि मजबूत C++ कोड कैसे लिखें जो विफलताओं को सही ढंग से संभालता है, संसाधनों को लीक नहीं करता है, और पठनीय बना रहता है।
1. try/catch की मूल बातें और सामान्य नुकसान
मूल सिंटैक्स सभी से परिचित है:
#include <iostream>#include <stdexcept>
void dangerousFunction(int value) { if (value < 0) { throw std::invalid_argument("Value must be non-negative"); } // ... work with value}
int main() { try { dangerousFunction(-5); } catch (const std::invalid_argument& e) { std::cerr << "Error: " << e.what() << std::endl; } catch (const std::exception& e) { std::cerr << "Generic error: " << e.what() << std::endl; } catch (...) { std::cerr << "Unknown exception caught" << std::endl; } return 0;}महत्वपूर्ण बिंदु:
- संदर्भ द्वारा पकड़ें —
catch (const std::exception& e)ऑब्जेक्ट स्लाइसिंग से बचाता है। - कैच ब्लॉक का क्रम मायने रखता है: पहले अधिक विशिष्ट अपवाद, फिर सामान्य।
catch (...)का अत्यधिक उपयोग न करें — यह महत्वपूर्ण त्रुटियों सहित सभी त्रुटियों को छुपाता है (जैसे,std::bad_alloc)।- डिस्ट्रक्टर से कभी अपवाद न फेंकें — यह अपरिभाषित व्यवहार की ओर ले जाता है (आमतौर पर असामान्य समाप्ति)।
2. संसाधन प्रबंधन के लिए try/catch के विकल्प के रूप में RAII
RAII (रिसोर्स एक्विजिशन इज़ इनिशियलाइज़ेशन) एक प्रमुख C++ पैटर्न है जो अपवादों को सुरक्षित बनाता है। विचार: एक संसाधन कंस्ट्रक्टर में प्राप्त किया जाता है और डिस्ट्रक्टर में जारी किया जाता है। यदि कोई अपवाद होता है, तो सभी बनाए गए ऑब्जेक्ट के डिस्ट्रक्टर स्वचालित रूप से कॉल होते हैं (स्टैक अनवाइंडिंग)।
#include <fstream>#include <vector>#include <stdexcept>
void processFile(const std::string& filename) { std::ifstream file(filename); // RAII: फ़ाइल कंस्ट्रक्टर में खुलती है if (!file.is_open()) { throw std::runtime_error("Cannot open file: " + filename); }
std::vector<int> data; int value; while (file >> value) { data.push_back(value); } // फ़ाइल डिस्ट्रक्टर फ़ाइल को स्वचालित रूप से बंद कर देगा, // भले ही कोई अपवाद हो (जैसे, push_back के दौरान bad_alloc)}मैन्युअल try/catch पर RAII के लाभ:
finallyब्लॉक लिखने की आवश्यकता नहीं है — डिस्ट्रक्टर सफाई की गारंटी देते हैं।- कोड अधिक रैखिक और पठनीय हो जाता है।
- अपवाद मेमोरी, फ़ाइल डिस्क्रिप्टर आदि के लीक का कारण नहीं बनते।
3. अपवाद सुरक्षा गारंटी
C++ में, फ़ंक्शन के लिए तीन स्तरों की गारंटी को अलग करना आम है:
- नो-थ्रो गारंटी — फ़ंक्शन कभी अपवाद नहीं फेंकता।
noexceptके साथ चिह्नित। - मजबूत गारंटी — यदि कोई अपवाद होता है, तो प्रोग्राम स्थिति अपरिवर्तित रहती है (परमाणु संक्रिया)।
- मूल गारंटी — अपवाद पर, कोई संसाधन लीक नहीं होता, ऑब्जेक्ट सुसंगत स्थिति में रहते हैं, लेकिन उनका मान बदल सकता है।
मजबूत गारंटी के साथ उदाहरण (कॉपी-एंड-स्वैप इडियम):
#include <algorithm> // for std::swap#include <vector>#include <stdexcept>
class SafeVector { std::vector<int> data_;public: void push_back(int value) { // 1. एक कॉपी बनाएं