Xatoliklarni boshqarish


ULASHISH

Nima uchun xatolarni hal qilish kerak?

Xatolar har qanday dasturda muqarrar, lekin ularni qanday hal qilish siz hamma narsani farq qiladi. Node.js da xatolarni to‘g‘ri hal qilish juda muhim, chunki:

  • Bu ilovalarning kutilmaganda ishdan chiqishini oldini oladi
  • U foydalanuvchilarga mazmunli fikr-mulohazalarni taqdim etadi
  • Tegishli xato konteksti bilan debug’ni osonlashtiradi
  • Bu ishlab chiqarishda dastur barqarorligini saqlashga yordam beradi
  • Bu resurslarning to‘g‘ri tozalanishini ta’minlaydi

Node.js da keng tarqalgan xato turlari

Turli xil xato turlarini tushunish ularni to‘g‘ri hal qilishga yordam beradi:

1. Standart JavaScript xatolari

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

// TypeError
null.someProperty;

// ReferenceError
unknownVariable;

2. Tizim xatolari

// 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'
});

Asosiy xatolarni boshqarish

Node.js xatolarni qayta ishlash uchun bir nechta naqshlarga amal qiladi:

Xato - birinchi callback funksiyasilar

Node.js asosiy modullaridagi eng keng tarqalgan pattern: unda callback’ning birinchi argumenti xato obyekti bo‘ladi (agar xato yuz bergan bo‘lsa).

Misol: Error-first callback

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);
});
Misolni ishga tushirish »

Zamonaviy xatolarni boshqarish

Async/Await bilan try...catch dan foydalanish

Async/await bilan sinxron va asinxron kod uchun try/catch bloklaridan foydalanishingiz mumkin:

Misol: Async/Await bilan sinab ko‘ring/tutib oling

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.)
  }
})();
Misolni ishga tushirish »


Global xatolarni boshqarish

Tugallanmagan istisnolar

Kutilmagan xatolar uchun, chiqishdan oldin tozalashni amalga oshirish uchun uncaughtExceptionni tinglashingiz mumkin:

Misol: Global xato ishlov beruvchilari

// 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);

Eng yaxshi amaliyotlar bilan ishlashda xatolik

Qilish va qilmaslik

Do

  • Xatolarni tegishli darajada hal qiling
  • Yetarli kontekstli xatolarni qayd qiling
  • Turli stsenariylar uchun maxsus xato turlaridan foydalaning
  • Nihoyat bloklardagi resurslarni tozalang
  • Xatolarni erta aniqlash uchun kiritilgan ma’lumotlarni tasdiqlang

qilmang

  • Ignore errors (empty catch blocks)
  • Mijozlarga nozik xato tafsilotlarini ko‘rsating
  • Stream nazorati uchun try/catch dan foydalaning
  • Xatolarni qayd qilmasdan yutib yuboring
  • Qayta tiklab bo‘lmaydigan xatolardan keyin bajarishni davom ettiring

Maxsus xato turlari

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');
  }
  // ...
}

Xulosa

Xatolarni samarali hal qilish mustahkam Node.js ilovalarini yaratishning muhim jihati hisoblanadi.

Turli xil xato turlarini tushunish, tegishli naqshlarni qo‘llash va eng yaxshi amaliyotlarga rioya qilish orqali siz barqarorroq, texnik xizmat ko‘rsatish va foydalanuvchilar uchun qulayroq ilovalar yaratishingiz mumkin.

Yodda tutingki, xatolarni to‘g‘ri hal qilish nafaqat buzilishlarning oldini olish, balki mazmunli fikr-mulohazalarni taqdim etish, ma’lumotlar yaxlitligini ta’minlash va hatto ish noto‘g‘ri ketganda ham yaxshi foydalanuvchi tajribasini ta’minlashdir.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!