Q43. How do you handle errors in asynchronous JavaScript?
try-catch, catch method ও finally দিয়ে asynchronous error সামলানোর সঠিক উপায়।
Synchronous কোডে error ধরতে try...catch কাজ করে, কিন্তু asynchronous কোডে try...catch সবসময় কাজ করে না — কারণ callback তখনও আসেনি, অথচ try block ইতিমধ্যে শেষ হয়ে গেছে।
// ❌ এভাবে কাজ করবে না
setTimeout(() => {
throw new Error("কিছু ভুল হয়েছে");
}, 100);
try {
// এখানে কিছু ঘটেনি, তাই catch কাজ করার কোনো সুযোগই নেই
console.log("এই লাইন চলবে");
} catch (error) {
console.log("এটা কখনো ছাপা হবে না");
}
// error হবে: Uncaught Errorসমস্যা হলো throw হওয়ার সময় try...catch block অনেক আগেই শেষ হয়ে গেছে। তাই catch কখনো কাজ করে না।
// ✅ সঠিক উপায় — catch method ব্যবহার করা
setTimeout(() => {
console.log("এই লাইন ছাপা হয়");
}, 100);
function risky() {
throw new Error("কিছু ভুল হয়েছে");
}
setTimeout(() => {
try {
risky();
} catch (error) {
console.log("ধরা পড়েছে:", error.message);
}
}, 100);সবচেয়ে সুন্দর উপায় হলো async/await ব্যবহার করা, কারণ তখন try...catch স্বাভাবিকভাবেই কাজ করে।
async function loadUser() {
try {
const response = await fetch("/api/user");
if (!response.ok) {
throw new Error("HTTP " + response.status);
}
const data = await response.json();
return data;
} catch (error) {
console.error("ত্রুটি:", error.message);
return null;
} finally {
console.log("যেকোনো অবস্থাতেই চলবে");
}
}ধাপে ধাপে — await fetch ইনপুট নেওয়া পর্যন্ত অপেক্ষা করে, await response.json() body পড়া পর্যন্ত অপেক্ষা করে। যেকোনো ধাপে error এলে সরাসরি catch block-এ চলে যায় এবং finally block সবসময় চলে।
// একটির ব্যর্থ হলে সব ব্যর্থ হিসেবে গণ্য হবে
const results = await Promise.allSettled([
fetchUser(),
fetchOrders(),
]);
for (const result of results) {
if (result.status === "rejected") {
console.log("কোনটা ব্যর্থ:", result.reason.message);
}
}// async ফাংশনের নিজস্ব try-catch না থাকলে
// অপেক্ষা করার জায়গায় catch দিতে হয়
async function loadAll() {
return Promise.all([loadUser(), loadOrders()]);
}
loadAll()
.then(([user, orders]) => console.log(user, orders))
.catch((error) => console.log("ধরা পড়েছে:", error.message));// try-catch ছাড়া ও error ধরা যায়
async function loadSafely() {
const user = await loadUser().catch((error) => {
console.log("লোড হয়নি:", error.message);
return null; // বাকি কাজ চালিয়ে যাওয়ার জন্য default মান
});
if (user) {
console.log(user.name);
}
}// window event ও timer-এর error
window.addEventListener("error", (event) => {
console.error("অপ্রত্যাশিত error:", event.message);
});
window.addEventListener("unhandledrejection", (event) => {
console.error("অপেক্ষা করা ছিল না এমন Promise error:", event.reason);
});// ভুল: এখানে catch কাজ করবে না
async function bad() {
return loadUser().then((user) => {
throw new Error("ভুল হয়েছে");
});
}
// ✅ সঠিক: catch বাইরে, তাই ধরা পড়ে
async function good() {
const user = await loadUser();
if (!user) throw new Error("ভুল হয়েছে");
return user;
}| পরিস্থিতি | try...catch কাজ করবে? |
|---|---|
await ব্যবহার করলে | হ্যাঁ |
setTimeout callback-এ | শুধু callback-এর ভেতরে |
.then() chain-এ | না, catch লাগবে |
Promise.all-এ | না, try-catch লাগবে |
উপরের try block-এ না থাকলে | না |
অনেকজন try...catch লিখে অপেক্ষা করে await দিতে ভুলে যান — ফলে error ধরা পড়ে না। আর catch খালি রেখে দিলে error চুপচাপ হারিয়ে যায়, যা ডিবাগ করা কঠিন করে তোলে; সবসময় অন্তত console.error দিয়ে লগ করুন।