JavaScript में त्रुटि प्रबंधन: try/catch और अन्य
त्रुटि प्रबंधन JavaScript में डेवलपमेंट के मुख्य कार्यों में से एक है, विशेष रूप से Node.js वातावरण में, जहाँ सर्वर एप्लिकेशन की स्थिरता सीधे उपयोगकर्ता अनुभव को प्रभावित करती है। अनहैंडल किए गए अपवाद पूरी प्रक्रिया को क्रैश कर सकते हैं और डेटा हानि का कारण बन सकते हैं। इस लेख में हम न केवल क्लासिक try/catch ब्लॉक को समझेंगे, बल्कि उन्नत तकनीकों को भी कवर करेंगे: finally के साथ काम करना, कस्टम त्रुटि प्रकार बनाना, एसिंक्रोनस त्रुटियों को संभालना और Node.js के लिए सर्वोत्तम अभ्यास।
1. मूल बातें: try, catch और finally
try/catch ब्लॉक सिंक्रोनस अपवादों को पकड़ने का मूलभूत तंत्र है। यदि try ब्लॉक में कोई त्रुटि होती है, तो निष्पादन तुरंत catch में स्थानांतरित हो जाता है। finally ब्लॉक हमेशा निष्पादित होता है - चाहे त्रुटि हुई हो या नहीं। यह संसाधनों को मुक्त करने (फ़ाइलें बंद करना, कनेक्शन बंद करना) के लिए सुविधाजनक है।
const fs = require('fs');
function readConfig(path) { try { const data = fs.readFileSync(path, 'utf8'); console.log('कॉन्फ़िगरेशन लोड हो गया'); return JSON.parse(data); } catch (err) { console.error('कॉन्फ़िग पढ़ने में त्रुटि:', err.message); return null; } finally { console.log('पढ़ने का प्रयास समाप्त'); }}
const config = readConfig('./config.json');console.log(config); // त्रुटि होने पर nullमहत्वपूर्ण: catch केवल try में उत्पन्न त्रुटियों को पकड़ता है। catch या finally में त्रुटियाँ अनहैंडल रहती हैं।
2. JavaScript और Node.js में त्रुटियों के प्रकार
JavaScript में कई बिल्ट-इन त्रुटि प्रकार हैं, जिनमें से प्रत्येक Error से इनहेरिट करता है:
- SyntaxError — कोड पार्सिंग में सिंटैक्स त्रुटि।
- ReferenceError — गैर-मौजूद वेरिएबल का संदर्भ।
- TypeError — अमान्य डेटा प्रकार (उदाहरण के लिए, गैर-फ़ंक्शन को कॉल करना)।
- RangeError — मान स्वीकार्य सीमा से बाहर।
- URIError — URI (encodeURI/decodeURI) के साथ काम करते समय त्रुटि।
Node.js में AssertionError (मॉड्यूल assert से) और सिस्टम त्रुटियाँ (EACCES, ENOENT और अन्य) मॉड्यूल fs से जोड़ी गई हैं, जिनमें code प्रॉपर्टी में त्रुटि कोड होता है।
try { require('fs').readFileSync('/nonexistent');} catch (err) { if (err.code === 'ENOENT') { console.log('फ़ाइल नहीं मिली'); } else { console.log('अन्य त्रुटि:', err.message); }}3. कस्टम त्रुटियाँ बनाना
त्रुटि प्रबंधन तर्क पर अधिक सटीक नियंत्रण के लिए, Error को एक्सटेंड करने वाले स्वयं के त्रुटि क्लास बनाने की अनुशंसा की जाती है। यह बिज़नेस लॉजिक त्रुटियों को सिस्टम विफलताओं से अलग करने की अनुमति देता है।
class ValidationError extends Error { constructor(message, field) { super(message); this.name = 'ValidationError'; this.field = field; }}
class DatabaseError extends Error { constructor(message, query) { super(message); this.name = 'DatabaseError'; this.query = query; }}
function saveUser(user) { if (!user.email) { throw new ValidationError('Email अनिवार्य है', 'email'); } // DB त्रुटि का अनुकरण throw new DatabaseError('कनेक्शन टाइमआउट', 'INSERT INTO users');}
try { saveUser({ name: 'इवान' });} catch (err) { if (err instanceof ValidationError) { console.log(`फ़ील्ड ${err.field}: ${err.message}`); } else if (err instanceof DatabaseError) { console.error(`DB त्रुटि (${err.query}): ${err.message}`); // पुनः प्रयास या लॉगिंग } else { console.error('अज्ञात त्रुटि:', err); }}instanceof का उपयोग स्ट्रिंग कोड की जाँच का सहारा लिए बिना हैंडलर श्रृंखला बनाने की अनुमति देता है।