Error Handling
try/catch, throw, custom error, Error class, finally, unhandled rejection, সঠিক error মেসেজ — বাংলায়।
অ্যাপে error অনিবার্য — কিন্তু error-কে ঠিকমতো handle করা যায়। এই পর্বে try/catch, throw, custom error আর asynchronous error-এর কৌশল।
try/catch — বেসিক
try {
const result = riskyOperation();
console.log(result);
} catch (err) {
console.error("ব্যর্থ:", err.message);
}try-র ভেতরে error হলে বাকি try থামে, নিয়ন্ত্রণ catch-এ চলে। err.message-এ বিস্তারিত।
throw
function divide(a, b) {
if (b === 0) {
throw new Error("০ দিয়ে ভাগ করা যায় না");
}
return a / b;
}
try {
console.log(divide(10, 0));
} catch (err) {
console.error(err.message); // ০ দিয়ে ভাগ করা যায় না
}throw new Error(...) নিজে error তৈরি করে। যেকোনো value throw করা যায়, তবে Error দিলে stack trace-সহ।
finally
try {
await save(data);
} catch (err) {
console.error("save ব্যর্থ");
} finally {
setLoading(false); // সফল/ব্যর্থ — দুই-ই চলে
}finally try/catch-এর পরে সবসময় চলে — cleanup (loading বন্ধ, resource খোলা) এর জন্য।
Custom error
class ValidationError extends Error {
constructor(field, message) {
super(message);
this.name = "ValidationError";
this.field = field;
}
}
try {
throw new ValidationError("email", "ইমেইল ঠিক নয়");
} catch (err) {
if (err instanceof ValidationError) {
console.error(`[${err.field}] ${err.message}`);
} else {
console.error("অন্যান্য", err);
}
}Error-কে subclass করে domain-নির্দিষ্ট error বানানো যায় — instanceof দিয়ে আলাদা handling সহজ হয়।
Asynchronous error
// async function-এ
async function load() {
try {
const res = await fetch("/api/data");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data;
} catch (err) {
console.error("লোড ব্যর্থ:", err.message);
throw err; // উপরেও জানাও (রি-থ্রো)
}
}
// .then/catch chain-এ
fetch("/api/data")
.then((res) => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.catch((err) => console.error(err.message));async-এ error-ও promise reject-এ পরে — await-এtry/catch, chain-এ .catch()। throw err দিয়ে উপরের স্তরে জানানো যায়।
সঠিক error message
error message-কে ব্যবহারকারীর বোধে সহজ রাখুন — কোড-মানুষ যেটা বুঝবে না। কী হয়েছে ও কী করতে হবে — দুই-ই উল্লেখ ভালো।
function validateAge(age) {
if (typeof age !== "number") {
throw new TypeError("বয়স অবশ্যই সংখ্যা হতে হবে");
}
if (age < 0 || age > 150) {
throw new RangeError("বয়স অবিশ্বাস্য (0–150 চান)");
}
return true;
}
try {
validateAge("তিরিশ");
} catch (err) {
console.error(err.name + ": " + err.message); // TypeError: ...
}built-in error ধরন: Error, TypeError, RangeError, ReferenceError, SyntaxError। appropriate ধরন বাছুন।
বিশ্বের সাথে মিলিয়ে
অনিয়ন্ত্রিত unhandled error ধরার ব্যবস্থা:
window.addEventListener("error", (e) => {
console.error("window error:", e.message);
});
window.addEventListener("unhandledrejection", (e) => {
console.error("unhandled promise:", e.reason);
});window.onerror ও unhandledrejection দিয়ে খোঁজা-নাখোঁজা error বের হয় — production monitoring-এর শুরু।
| ধরন | ব্যবহার |
|---|---|
Error | সাধারণ |
TypeError | wrong type |
RangeError | সীমা-অতিরিক্ত |
ReferenceError | undefined variable |
SyntaxError | invalid syntax |
catch-এ স্রেফ log করে ভান না — ঠিক কী করবেন ঠিক করুন: fallback, retry, ব্যবহারকারী-বার্তা, অথবা re-throw।
"TypeError ও RangeError পার্থক্য?" — type wrong (সংখ্যা=string) বনাম মান-সীমা (০–১৫০)। plus: async-এ কীভাবে handle — catch/rejection।
একটি JSON parse ফাংশন লিখুন যা invalid input-এ custom ParseError throw করে এবং caller ও এটির fallback দেখায়।