Node.js Error Handling

मजबूत Node.js एप्लिकेशन बनाने के लिए त्रुटि प्रबंधन के महत्व को समझें

त्रुटियाँ क्यों संभालें?

किसी भी प्रोग्राम में त्रुटियाँ अपरिहार्य हैं, लेकिन आप उन्हें कैसे संभालते हैं, इससे बहुत फर्क पड़ता है। Node.js में, उचित त्रुटि प्रबंधन महत्वपूर्ण है क्योंकि:

अचानक शटडाउन रोकता है

ऐप्स को अप्रत्याशित रूप से क्रैश होने से रोकता है

उपयोगकर्ताओं के लिए सार्थक प्रतिक्रिया

उपयोगकर्ताओं को सार्थक प्रतिक्रिया प्रदान करता है

डिबगिंग को आसान बनाता है

उचित त्रुटि संदर्भ के साथ डिबगिंग की सुविधा प्रदान करता है

उत्पादन में स्थिरता

उत्पादन में अनुप्रयोग निरंतरता बनाए रखने में मदद करता है

Node.js में सामान्य त्रुटि प्रकार

विभिन्न त्रुटि प्रकारों को समझने से आपको उनसे ठीक से निपटने में मदद मिलती है:

1. जावास्क्रिप्ट त्रुटियाँ ठीक की गईं

// SyntaxError
JSON.parse('{invalid json}');

// TypeError
null.someProperty;

// ReferenceError
unknownVariable;

2. कंप्यूटर त्रुटियाँ

// ENOENT: No such file or directory
const fs = require('fs');
fs.readFile('nonexistent.txt', (err) => {
  console.error(err.code); // 'ENOENT'
});

// ECONNREFUSED: Connection refused
const http = require('http');
const req = http.get('http://nonexistent-site.com', (res) => {});
req.on('error', (err) => {
  console.error(err.code); // 'ECONNREFUSED' or 'ENOTFOUND'
});

बुनियादी त्रुटि प्रबंधन

Node.js :

त्रुटि-प्रथम कॉलबैक

Node.js , ( ).

उदाहरण: त्रुटि-प्रथम कॉलबैक

const fs = require('fs');

function readConfigFile(filename, callback) {
  fs.readFile(filename, 'utf8', (err, data) => {
    if (err) {
      // Handle specific error types
      if (err.code === 'ENOENT') {
        return callback(new Error(`Config file ${filename} not found`));
      } else if (err.code === 'EACCES') {
        return callback(new Error(`No permission to read ${filename}`));
      }
      // For all other errors
      return callback(err);
    }

    // Process data if no error
    try {
      const config = JSON.parse(data);
      callback(null, config);
    } catch (parseError) {
      callback(new Error(`Invalid JSON in ${filename}`));
    }
  });
}

// Usage
readConfigFile('config.json', (err, config) => {
  if (err) {
    console.error('Failed to read config:', err.message);
    // Handle the error (e.g., use default config)
    return;
  }
  console.log('Config loaded successfully:', config);
});

आधुनिक त्रुटि प्रबंधन

Async/Await के साथ प्रयास...पकड़ का उपयोग करना

एसिंक/प्रतीक्षा के साथ, आप सिंक्रोनस और एसिंक्रोनस कोड दोनों के लिए ट्राई/कैच ब्लॉक का उपयोग कर सकते हैं:

उदाहरण: Async/प्रतीक्षा के साथ प्रयास करें/पकड़ें

const fs = require('fs').promises;

async function loadUserData(userId) {
  try {
    const data = await fs.readFile(`users/${userId}.json`, 'utf8');
    const user = JSON.parse(data);

    if (!user.email) {
      throw new Error('Invalid user data: missing email');
    }

    return user;
  } catch (error) {
    // Handle different error types
    if (error.code === 'ENOENT') {
      throw new Error(`User ${userId} not found`);
    } else if (error instanceof SyntaxError) {
      throw new Error('Invalid user data format');
    }
    // Re-throw other errors
    throw error;
  } finally {
    // Cleanup code that runs whether successful or not
    console.log(`Finished processing user ${userId}`);
  }
}

// Usage
(async () => {
  try {
    const user = await loadUserData(123);
    console.log('User loaded:', user);
  } catch (error) {
    console.error('Failed to load user:', error.message);
    // Handle error (e.g., show to user, retry, etc.)
  }
})();

वैश्विक त्रुटि प्रबंधन

न देखे गए अपवाद

अनपेक्षित त्रुटियों के लिए, बाहर निकलने से पहले क्लीनअप अनकॉटएक्सेप्शन के लिए पूछ सकता है:

उदाहरण: वैश्विक त्रुटि संचालक

// Handle uncaught exceptions (synchronous errors)
process.on('uncaughtException', (error) => {
  console.error('UNCAUGHT EXCEPTION! Shutting down...');
  console.error(error.name, error.message);

  // Perform cleanup (close database connections, etc.)
  server.close(() => {
    console.log('Process terminated due to uncaught exception');
    process.exit(1); // Exit with failure
  });
});

// Handle unhandled promise rejections
process.on('unhandledRejection', (reason, promise) => {
  console.error('UNHANDLED REJECTION! Shutting down...');
  console.error('Unhandled Rejection at:', promise, 'Reason:', reason);

  // Close server and exit
  server.close(() => {
    process.exit(1);
  });
});

// Example of an unhandled promise rejection
Promise.reject(new Error('Something went wrong'));

// Example of an uncaught exception
setTimeout(() => {
  throw new Error('Uncaught exception after timeout');
}, 1000);

सर्वोत्तम प्रथाओं को संभालने में त्रुटि

करने के लिए काम

त्रुटियों को उचित तरीके से संभालें
पर्याप्त संदर्भ के साथ त्रुटियों को लॉग करें
विभिन्न परिदृश्यों के लिए कस्टम त्रुटि प्रकारों का उपयोग करें
अंत में मॉड्यूल में संसाधनों को साफ करें
त्रुटियों को तुरंत पकड़ने के लिए इनपुट की जाँच करें

ऐसा मत करो

त्रुटियों पर ध्यान न दें (खाली कैच ब्लॉक)
ग्राहकों को संवेदनशील त्रुटि विवरण प्रकट करें
प्रवाह नियंत्रण के लिए प्रयास/पकड़ का उपयोग करें
त्रुटियों को लॉग किए बिना निगलें
पुनर्प्राप्त न की जा सकने वाली त्रुटियों के बाद भी संचालन जारी रखें

कस्टम त्रुटि प्रकार

class ValidationError extends Error {
  constructor(message, field) {
    super(message);
    this.name = 'ValidationError';
    this.field = field;
    this.statusCode = 400;
  }
}

class NotFoundError extends Error {
  constructor(resource) {
    super(`${resource} not found`);
    this.name = 'NotFoundError';
    this.statusCode = 404;
  }
}

// Usage
function getUser(id) {
  if (!id) {
    throw new ValidationError('User ID is required', 'id');
  }
  // ...
}

सारांश

प्रभावी त्रुटि प्रबंधन मजबूत Node.js अनुप्रयोगों के निर्माण का एक महत्वपूर्ण पहलू है।

विभिन्न त्रुटि प्रकारों को समझकर, उचित तरीकों का उपयोग करके और सर्वोत्तम प्रथाओं का पालन करके, आप अधिक स्थिर, रखरखाव योग्य और उपयोगकर्ता के अनुकूल एप्लिकेशन बना सकते हैं।

डाउनटाइम को रोकता है

अचानक होने वाली रुकावटों को रोकता है

सार्थक टिप्पणी

उपयोगकर्ताओं को सार्थक प्रतिक्रिया प्रदान करता है

आंकड़ा शुचिता

डेटा अखंडता बनाए रखता है

प्रयोगकर्ता का अनुभव

समस्याएँ होने पर भी अच्छा उपयोगकर्ता अनुभव सुनिश्चित करता है

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

  • अच्छे त्रुटि प्रबंधन का मतलब केवल दुर्घटनाओं को रोकना नहीं है
  • इसमें सार्थक प्रतिक्रिया प्रदान करना, डेटा अखंडता बनाए रखना और समस्याएं होने पर भी एक अच्छा उपयोगकर्ता अनुभव सुनिश्चित करना शामिल है
  • विभिन्न त्रुटि प्रकारों को समझें और उचित तरीकों का उपयोग करें
  • जब अंततः ब्लॉकों में संसाधनों को साफ़ करें
  • कस्टम त्रुटि प्रकार बेहतर त्रुटि प्रबंधन में मदद करते हैं

अभ्यास

सही शब्द चुनें।

Node.js , ______मॉड्यूल के साथ हेरफेर किया जा सकता है।

if...else
✗ ग़लत! यदि...अन्यथा ब्लॉक का उपयोग सशर्त तर्क के लिए किया जाता है, त्रुटि प्रबंधन के लिए नहीं
try...catch
✓ ठीक है! कोशिश करें...कैच मॉड्यूल का उपयोग Node.js में सिंक्रोनस और एसिंक्रोनस त्रुटियों को संभालने के लिए किया जाता है
switch...case
✗ ग़लत! स्विच...केस ब्लॉक का उपयोग कई सशर्त शाखाओं के लिए किया जाता है, त्रुटि प्रबंधन के लिए नहीं
for...in
✗ ग़लत! फॉर...इन ब्लॉक का उपयोग ऑब्जेक्ट के गुणों को रूट करने के लिए किया जाता है, त्रुटि प्रबंधन के लिए नहीं