Xatoliklarni boshqarish
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!
