रूस में JavaScript डेवलपर्स के वेतन: उन्नत डेवलपर्स के लिए बाजार का अवलोकन

शुरुआती लोगों के लिए ऑनलाइन 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('Timer failure!');  }, 1000);}

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


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



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

function safeAsync() {  return new Promise((resolve, reject) => {    setTimeout(() => {      reject(new Error('Timer failure!'));    }, 1000);  });}

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


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



2. कस्टम एरर क्लासेस: सिमैंटिक्स और संदर्भ



new Error('Something went wrong') फेंकने के बजाय, अपनी खुद की एरर क्लासेस का एक पदानुक्रम बनाएं। यह हैंडलर को विफलता के प्रकार को समझने और तदनुसार प्रतिक्रिया देने की अनुमति देता है (जैसे, लॉग करना, मॉनिटरिंग को भेजना, या उपयोगकर्ता को एक विशिष्ट 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('User ID is required'); // ... तर्क जो DatabaseError फेंक सकता है}


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

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


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



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

ब्लॉग

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