परिचय: त्रुटि प्रबंधन विश्वसनीय कोड की नींव क्यों है
\nकोड में त्रुटियाँ अपरिहार्य हैं। वे उपयोगकर्ता के गलत डेटा, नेटवर्क विफलता, सर्वर पर फ़ाइलों की अनुपलब्धता या डेवलपर की सामान्य टाइपिंग गलतियों के कारण उत्पन्न होती हैं। Node.js वातावरण में, जहाँ कोड एसिंक्रोनस रूप से निष्पादित होता है और अक्सर बाहरी संसाधनों (डेटाबेस, फ़ाइल सिस्टम, API) के साथ इंटरैक्ट करता है, एक अनहैंडल त्रुटि पूरी प्रक्रिया को क्रैश कर सकती है। जावास्क्रिप्ट में उचित त्रुटि प्रबंधन एक नाजुक एप्लिकेशन को एक स्थिर सेवा में बदल देता है। इस लेख में, हम सभी प्रमुख तंत्रों को कवर करेंगे: क्लासिक try/catch से लेकर स्वयं के एरर क्लास बनाने और एसिंक्रोनस कोड के साथ काम करने तक।
1. मूल बातें: try, catch, finally और throw
\nजावास्क्रिप्ट में अपवादों को संभालने के लिए मूल ब्लॉक try...catch...finally संरचना है। यह कोड के "खतरनाक" भाग में उत्पन्न त्रुटि को "पकड़ने" और उस पर सही ढंग से प्रतिक्रिया करने की अनुमति देता है, बिना पूरे प्रोग्राम के निष्पादन को रोके।
try/catch का सिंटैक्स और कार्य
\nजो कोड अपवाद फेंक सकता है, उसे try ब्लॉक में रखा जाता है। यदि कोई त्रुटि होती है, तो नियंत्रण तुरंत catch ब्लॉक में स्थानांतरित हो जाता है, जहाँ त्रुटि ऑब्जेक्ट उपलब्ध होता है। यदि कोई त्रुटि नहीं है, तो catch ब्लॉक को अनदेखा कर दिया जाता है।
try {\n const data = JSON.parse('{"name": "अन्ना"}'); // सही JSON\n console.log(data.name); // आउटपुट: अन्ना\n} catch (error) {\n console.error('पार्सिंग त्रुटि:', error.message);\n}\n// निष्पादन जारी रहता है\n\nअब एक त्रुटि का अनुकरण करते हैं:
\ntry {\n const data = JSON.parse('अमान्य json'); // त्रुटि!\n console.log(data.name);\n} catch (error) {\n console.error('पार्सिंग त्रुटि:', error.message);\n // आउटपुट: पार्सिंग त्रुटि: Unexpected token 'अ', ... is not valid JSON\n}\nconsole.log('प्रोग्राम जीवित है!'); // यह कोड निष्पादित होगा\n\nfinally ब्लॉक: कोड जो हमेशा निष्पादित होगा
\nfinally ब्लॉक त्रुटि होने या न होने पर भी निष्पादित होता है। यह संसाधनों को मुक्त करने (फ़ाइलें बंद करना, DB कनेक्शन) या टाइमर साफ़ करने के लिए आदर्श है।
let resource = null;\ntry {\n resource = acquireResource(); // संसाधन प्राप्त करें\n resource.doSomething(); // खतरनाक ऑपरेशन\n} catch (error) {\n console.error('त्रुटि:', error);\n} finally {\n if (resource) {\n resource.close(); // हमेशा संसाधन बंद करें\n console.log('संसाधन मुक्त हो गया।');\n }\n}\n\nthrow ऑपरेटर: अपनी त्रुटियाँ बनाएँ
\nआप throw का उपयोग करके स्वयं त्रुटि "फेंक" सकते हैं। यह इनपुट डेटा के सत्यापन या व्यावसायिक तर्क के उल्लंघन पर निष्पादन को रोकने के लिए उपयोगी है। आप तर्क के रूप में कुछ भी पास कर सकते हैं, लेकिन सर्वोत्तम अभ्यास Error ऑब्जेक्ट या उसके वंशजों का उपयोग करना है।
function divide(a, b) {\n if (typeof a !== 'number' || typeof b !== 'number') {\n throw new Error('तर्क संख्याएँ होनी चाहिए');\n }\n if (b === 0) {\n throw new Error('शून्य से भाग देना निषिद्ध है');\n }\n return a / b;\n}\n\ntry {\n console.log(divide(10, 0));\n} catch (error) {\n console.error('त्रुटि:', error.message); // त्रुटि: शून्य से भाग देना निषिद्ध है\n}\n\n2. उन्नत तकनीकें: स्वयं के एरर क्लास और टाइपिंग
\nबड़ी परियोजनाओं में, केवल मानक Error का उपयोग करना पर्याप्त नहीं है। नेटवर्क, सत्यापन, प्राधिकरण और अन्य त्रुटियों के बीच अंतर करना आवश्यक है। इसके लिए, बिल्ट-इन Error का विस्तार करने वाले उपयोगकर्ता-परिभाषित क्लास बनाए जाते हैं।
कस्टम एरर बनाना
\nclass ValidationError extends Error {\n constructor(message) {\n super(message);\n this.name = 'ValidationError'; // जाँच के लिए अद्वितीय नाम\n }\n}\n\nclass NetworkError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = 'NetworkError';\n this.statusCode = statusCode;\n }\n}\n\nfunction fetchUser(id) {\n if (!id) {\n throw new Valida