এই কোর্স জুড়ে আপনি ইতিমধ্যে error হ্যান্ডেল করেছেন — একটি callback-এ err চেক করা, try/catch-এ await মোড়ানো। এই পাঠটি সেগুলো একত্র করে আর ভুল করলে Node-নির্দিষ্ট একটি পরিণতি কভার করে: একটি unhandled error শুধু যে রিকোয়েস্টটি এটি ঘটিয়েছে তা নয়, পুরো সার্ভারকে নামিয়ে দিতে পারে।
try {
const data = JSON.parse('not valid json')
} catch (err) {
console.error('Failed to parse:', err.message)
}সাধারণ try/catch — এখানে Node-নির্দিষ্ট কিছু নেই, এটি অন্য যেকোনো JavaScript-এর মতোই কাজ করে।
একটি callback-স্টাইল ফাংশনে একটি error throw হয় না — এটি callback-এর প্রথম আর্গুমেন্ট হিসেবে আসে, আর কলের চারপাশে try/catch এটি ধরার জন্য কিছুই করে না:
fs.readFile('missing.txt', 'utf8', (err, data) => {
if (err) {
console.error('Read failed:', err.message)
return // এখানেই থামুন — data undefined
}
console.log(data)
})async function loadConfig() {
try {
const data = await fs.readFile('config.json', 'utf8')
return JSON.parse(data)
} catch (err) {
console.error('Failed to load config:', err.message)
return null
}
}একটি একক Node প্রসেস সাধারণত একসাথে অনেক ভিন্ন ভিজিটরের অনেক রিকোয়েস্ট সামলায়। প্রতিটি try/catch থেকে পালিয়ে যাওয়া একটি error — throw হয়েছে কিন্তু কখনো ধরা হয়নি — পুরো প্রসেসটি ক্র্যাশ করে, যার অর্থ বর্তমানে সেবা পাওয়া প্রতিটি ভিজিটর তাদের সংযোগ হারায়, শুধু যার রিকোয়েস্ট error-টি ট্রিগার করেছে সে নয়।
const server = http.createServer((req, res) => {
try {
const result = riskyOperation(req)
res.end(result)
} catch (err) {
console.error(err)
res.writeHead(500)
res.end('Internal Server Error')
}
})রিকোয়েস্ট হ্যান্ডলিং এভাবে try/catch-এ মোড়ানো একটি খারাপ রিকোয়েস্টকে পুরো সার্ভার নামিয়ে দেওয়া থেকে ঠেকায় — এটি একটি প্রসেস ক্র্যাশকে একটি একক ব্যর্থ রেসপন্সে পরিণত করে।
নজরে রাখার মতো একটি ফাঁদ
একটি সাধারণ বাস্তব-জগতের ফাঁক: একটি রিকোয়েস্ট হ্যান্ডলার নিজের লজিক try/catch-এ মোড়ায়, কিন্তু এর ভেতরে await ছাড়া একটি async ফাংশন কল করে। সেই ফাংশনটি পরে reject হলে, rejection-টি try ব্লকের সম্পূর্ণ বাইরে ঘটে আর unhandled থেকে যায়। আপনি চান এমন একটি ঘিরে থাকা try/catch সত্যিই ধরুক এমন একটি async কল সবসময় await করুন।