जावास्क्रिप्ट में त्रुटि प्रबंधन: try/catch और Node.js में उन्नत तकनीकें

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

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

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

जावास्क्रिप्ट में त्रुटि प्रबंधन: try/catch और भी बहुत कुछ: उन्नत स्तर



त्रुटि प्रबंधन केवल एप्लिकेशन को क्रैश होने से बचाना नहीं है, बल्कि जावास्क्रिप्ट और Node.js पर विश्वसनीय और दोष-सहिष्णु सिस्टम बनाने का एक मूलभूत पहलू है। try/catch का बुनियादी उपयोग हर डेवलपर को पता है, लेकिन वास्तविक प्रोजेक्ट्स में, विशेष रूप से सर्वर साइड पर, कई बारीकियाँ उत्पन्न होती हैं: एसिंक्रोनस फ्लो, प्रॉमिस चेन, वैश्विक विफलताएँ और संरचित कस्टम त्रुटियों की आवश्यकता। इस लेख में, हम त्रुटि प्रबंधन की उन्नत तकनीकों पर चर्चा करेंगे जो आपको Node.js पर अधिक स्वच्छ और पूर्वानुमानित कोड लिखने में मदद करेंगी।



1. try/catch और एसिंक्रोनसिटी में गहराई से उतरना



क्लासिक try/catch सिंक्रोनस है। यह सामान्य फंक्शन के अंदर त्रुटियों को अच्छी तरह से पकड़ लेता है, लेकिन await के बिना एसिंक्रोनस कॉलबैक या प्रॉमिस के सामने विफल हो जाता है। Node.js में, जहाँ 90% कोड एसिंक्रोनस है, यह अक्सर "निगल लिए गए" अपवादों का कारण बनता है।



त्रुटि: try/catch setTimeout में त्रुटि नहीं पकड़ता

function dangerousAsync() {  setTimeout(() => {    throw new Error('टाइमर में विफलता!');  }, 1000);}

try { dangerousAsync();} catch (e) { console.log('पकड़ा गया:', e.message); // यह कोड निष्पादित नहीं होगा}


इस उदाहरण में, त्रुटि try के संदर्भ के बाहर फेंकी जाती है, और Node.js प्रक्रिया क्रैश हो जाएगी। सही तरीका प्रॉमिस या async/await का उपयोग करना है।



समाधान: एसिंक्रोनस कोड को Promise में लपेटना

function safeAsync() {  return new Promise((resolve, reject) => {    setTimeout(() => {      reject(new Error('टाइमर में विफलता!'));    }, 1000);  });}

(async () => { try { await safeAsync(); } catch (e) { console.log('पकड़ा गया:', e.message); // 1 सेकंड बाद निष्पादित होगा }})();


मुख्य नियम: किसी भी एसिंक्रोनस ऑपरेशन को प्रॉमिस में लपेटें, और try/catch के अंदर await का उपयोग करें। यह सुनिश्चित करता है कि त्रुटि सही संदर्भ में पकड़ी जाएगी।



2. कस्टम त्रुटि वर्ग: शब्दार्थ और संदर्भ



new Error('कुछ गलत हो गया') फेंकने के बजाय, अपनी स्वयं की त्रुटि वर्गों की पदानुक्रम बनाएँ। यह हैंडलर को विफलता के प्रकार को समझने और उसके अनुसार प्रतिक्रिया करने की अनुमति देता है (उदाहरण के लिए, लॉग करना, मॉनिटरिंग को भेजना, या उपयोगकर्ता को एक विशिष्ट HTTP स्थिति लौटाना)।



class AppError extends Error {  constructor(message, statusCode = 500) {    super(message);    this.name = this.constructor.name;    this.statusCode = statusCode;    Error.captureStackTrace(this, this.constructor);  }}

class ValidationError extends AppError { constructor(message) { super(message, 400); }}

class DatabaseError extends AppError { constructor(message, originalError) { super(message, 503); this.originalError = originalError; // डिबगिंग के लिए मूल त्रुटि सहेजें }}

// उपयोगfunction findUser(id) { if (!id) throw new ValidationError('उपयोगकर्ता ID अनिवार्य है'); // ... तर्क जो DatabaseError फेंक सकता है}


इस दृष्टिकोण के लाभ:

  • पठनीयता: वर्ग का नाम तुरंत समस्या की प्रकृति बताता है।
  • रूटिंग: वैश्विक हैंडलर में, आप instanceof की जाँच कर सकते हैं और प्रतिक्रिया रणनीति चुन सकते हैं।
  • अतिरिक्त फ़ील्ड: आप कोई भी डेटा जोड़ सकते हैं (statusCode, originalError, userId आदि)।


3. Node.js में वैश्विक त्रुटि हैंडलर



सबसे सावधानीपूर्वक नियंत्रण के बावजूद, अनहैंडल त्रुटियाँ बाहर निकल सकती हैं। Node.js में उन्हें पकड़ने के लिए दो मुख्य इवेंट हैं: uncaughtException और unhandledRejection

ब्लॉग

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