C++ में त्रुटि प्रबंधन: try/catch और उससे आगे — पूर्ण गाइड

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

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

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

C++ में त्रुटि प्रबंधन का परिचय

त्रुटि प्रबंधन C++ में विश्वसनीय सॉफ़्टवेयर विकसित करने के मुख्य कार्यों में से एक है। कुछ भाषाओं (जैसे Python या Java) के विपरीत, जहाँ अपवाद ही एकमात्र मानक तंत्र हैं, C++ डेवलपर को कई दृष्टिकोण प्रदान करता है। सही रणनीति का चुनाव कोड की स्थिरता, प्रदर्शन और पठनीयता पर निर्भर करता है। इस लेख में हम क्लासिक try/catch संरचना, C++17/20 मानक की आधुनिक क्षमताओं और त्रुटि प्रबंधन के वैकल्पिक तरीकों पर चर्चा करेंगे।



1. क्लासिक दृष्टिकोण: try/catch संरचना

C++ में अपवाद प्रबंधन का मुख्य तंत्र तीन मुख्य कीवर्ड पर आधारित है: try, catch और throw। अपवाद किसी भी प्रकार की वस्तु है जो त्रुटि होने पर "फेंकी" जाती है और संबंधित ब्लॉक में "पकड़ी" जाती है।



#include <iostream>#include <stdexcept>

double divide(double a, double b) { if (b == 0) { throw std::runtime_error("शून्य से भाग!"); } return a / b;}

int main() { try { double result = divide(10, 0); std::cout << "परिणाम: " << result << std::endl; } catch (const std::runtime_error& e) { std::cerr << "त्रुटि: " << e.what() << std::endl; } catch (...) { std::cerr << "अज्ञात त्रुटि!" << std::endl; } return 0;}


महत्वपूर्ण बिंदु:

  • अपवादों का पदानुक्रम: std::exception (जैसे std::runtime_error, std::logic_error) से प्राप्त वर्गों की वस्तुओं को फेंकने की सिफारिश की जाती है।
  • संदर्भ द्वारा पकड़ना: हमेशा अपवादों को स्थिर संदर्भ (const std::exception&) से पकड़ें ताकि स्लाइसिंग और अनावश्यक कॉपी से बचा जा सके।
  • सार्वभौमिक हैंडलर: catch (...) किसी भी अपवाद को पकड़ता है, लेकिन त्रुटि वस्तु तक पहुँच प्रदान नहीं करता। इसे केवल अंतिम उपाय के रूप में उपयोग करें।


2. वैकल्पिक दृष्टिकोण: रिटर्न कोड और std::optional

हमेशा अपवाद सबसे अच्छा विकल्प नहीं होते। उच्च-लोड सिस्टम या एम्बेडेड प्रोग्रामिंग में अक्सर हल्के तंत्र को प्राथमिकता दी जाती है।



2.1. रिटर्न कोड (त्रुटि कोड)

फ़ंक्शन एक पूर्णांक या एनुम लौटाता है जो सफलता या त्रुटि के प्रकार को इंगित करता है। यह विधि सरल और कुशल है, लेकिन परिणाम की स्पष्ट जाँच की आवश्यकता होती है।



enum class ErrorCode { Success, DivisionByZero, Overflow };

ErrorCode safe_divide(double a, double b, double& result) { if (b == 0.0) return ErrorCode::DivisionByZero; result = a / b; return ErrorCode::Success;}

int main() { double res; ErrorCode err = safe_divide(10, 0, res); if (err != ErrorCode::Success) { // त्रुटि प्रबंधन }}


2.2. std::optional (C++17)

एक कंटेनर जो मान रख सकता है या खाली हो सकता है। उन स्थितियों के लिए आदर्श जहाँ त्रुटि का अर्थ परिणाम का अभाव है।



#include <optional>

std::optional<double> divide_opt(double a, double b) { if (b == 0.0) return std::nullopt; return a / b;}

int main() { auto result = divide_opt(10, 2); if (result) { std::cout << *result << std::endl; } else { std::cout << "भाग त्रुटि" << std::endl; }}


3. आधुनिक क्षमताएँ: noexcept और std::expected (C++23)

C++ मानक विकसित हो रहा है, त्रुटियों के साथ काम करने के लिए अधिक अभिव्यंजक साधन प्रदान करता है।



3.1. noexcept विनिर्देश

कीवर्ड noexcept इंगित करता है कि फ़ंक्शन अपवाद नहीं फेंकता। यह कंपाइलर को कोड को अनुकूलित करने में मदद करता है और इंटरफ़ेस को अधिक स्पष्ट बनाता है।



void l                

ब्लॉग

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